RSA 实现

/*** 2008-6-11*/
package org.zlex.chapter09_1;import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;import java.util.HashMap;
import java.util.Map;/*** RSA安全编码组件* * @author 梁栋* @version 1.0*/
public abstract class RSACoder {/*** 数字签名* 密钥算法*/public static final String KEY_ALGORITHM = "RSA";/*** 数字签名* 签名/验证算法*/public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";/*** 公钥*/private static final String PUBLIC_KEY = "RSAPublicKey";/*** 私钥*/private static final String PRIVATE_KEY = "RSAPrivateKey";/*** RSA密钥长度 默认1024位,*  密钥长度必须是64的倍数, *  范围在512至65536位之间。*/private static final int KEY_SIZE = 512;/*** 签名* * @param data*            待签名数据* @param privateKey*            私钥* @return byte[] 数字签名* @throws Exception*/public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {// 转换私钥材料PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKey);// 实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 取私钥匙对象PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);// 实例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 初始化Signaturesignature.initSign(priKey);// 更新signature.update(data);// 签名return signature.sign();}/*** 校验* * @param data*            待校验数据* @param publicKey*            公钥* @param sign*            数字签名* * @return boolean 校验成功返回true 失败返回false* @throws Exception* */public static boolean verify(byte[] data, byte[] publicKey, byte[] sign)throws Exception {// 转换公钥材料X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);// 实例化密钥工厂KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);// 生成公钥PublicKey pubKey = keyFactory.generatePublic(keySpec);// 实例化SignatureSignature signature = Signature.getInstance(SIGNATURE_ALGORITHM);// 初始化Signaturesignature.initVerify(pubKey);// 更新signature.update(data);// 验证return signature.verify(sign);}/*** 取得私钥* * @param keyMap* @return* @throws Exception*/public static byte[] getPrivateKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PRIVATE_KEY);return key.getEncoded();}/*** 取得公钥* * @param keyMap* @return* @throws Exception*/public static byte[] getPublicKey(Map<String, Object> keyMap)throws Exception {Key key = (Key) keyMap.get(PUBLIC_KEY);return key.getEncoded();}/*** 初始化密钥* * @return Map 密钥对儿 Map* @throws Exception*/public static Map<String, Object> initKey() throws Exception {// 实例化密钥对儿生成器KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);// 初始化密钥对儿生成器keyPairGen.initialize(KEY_SIZE);// 生成密钥对儿KeyPair keyPair = keyPairGen.generateKeyPair();// 公钥RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();// 私钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();// 封装密钥Map<String, Object> keyMap = new HashMap<String, Object>(2);keyMap.put(PUBLIC_KEY, publicKey);keyMap.put(PRIVATE_KEY, privateKey);return keyMap;}
}

RSA 示例

/*** 2008-6-11*/
package org.zlex.chapter09_1;import static org.junit.Assert.*;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;
import org.junit.Before;
import org.junit.Test;import java.util.Map;/*** RSA数字签名校验* * @author 梁栋* @version 1.0*/
public class RSACoderTest {/*** 公钥*/private byte[] publicKey;/*** 私钥*/private byte[] privateKey;/*** 初始化密钥* * @throws Exception*/@Beforepublic void initKey() throws Exception {Map<String, Object> keyMap = RSACoder.initKey();publicKey = RSACoder.getPublicKey(keyMap);privateKey = RSACoder.getPrivateKey(keyMap);System.err.println("公钥: \n" + Base64.encodeBase64String(publicKey));System.err.println("私钥: \n" + Base64.encodeBase64String(privateKey));}/*** 校验* * @throws Exception*/@Testpublic void testSign() throws Exception {String inputStr = "RSA数字签名";byte[] data = inputStr.getBytes();// 产生签名byte[] sign = RSACoder.sign(data, privateKey);System.err.println("签名:\n" + Hex.encodeHexString(sign));// 验证签名boolean status = RSACoder.verify(data, publicKey, sign);System.err.println("状态:\n" + status);assertTrue(status);}}

Java加密与解密的艺术~数字签名~RSA实现相关推荐

  1. Java加密与解密的艺术~数字签名~ECDSA实现

    ECDSA 实现 /*** 2009-10-10*/ package org.zlex.chapter09_3;import java.math.BigInteger; import java.sec ...

  2. Java加密与解密的艺术~数字签名~DSA实现

    DSA 实现 /*** 2008-6-13*/ package org.zlex.chapter09_2;import java.security.Key; import java.security. ...

  3. Java加密与解密的艺术~数字签名~模型分析

    甲方作为消息的发送方,乙方作为消息的接收方.假设甲乙双方在消息传递之前已经指定了要使的数字签名算法(如RSA算法).为完成签名验证,甲乙双方需要以下操作: 1).由消息发送方(甲方)构建密钥对. 2) ...

  4. 安卓逆向_25 --- 密码学 之 《Java加密与解密的艺术》

    <Java加密与解密的艺术>中文 PDF版 :https://www.jb51.net/books/65048.html 1. 密码学应用 :https://www.bilibili.co ...

  5. Java加密与解密的艺术~RSA实现

    RSA 实现 /*** 2008-6-11*/ package org.zlex.chapter08_2;import java.security.Key; import java.security. ...

  6. Java加密与解密的艺术~AES-GCM-NoPadding实现

    来源:Java AES加密和解密_一名可爱的技术搬运工-CSDN博客 高级加密标准 (AES,Rijndael)是一种分组密码加密和解密算法,是全球使用最广泛的加密算法. AES使用128.192或2 ...

  7. Java加密与解密的艺术~数字证书~证书使用openssl

    证书工具 /*** 2009-5-20*/ package org.zlex.chapter10_2;import java.io.FileInputStream; import java.secur ...

  8. Java加密与解密的艺术~数字证书~证书使用keytool

    证书工具 /*** 2009-5-20*/ package org.zlex.chapter10_1;import java.io.FileInputStream; import java.secur ...

  9. Java加密与解密的艺术~RSA模型分析

    我们仍以甲乙两方收发消息为例.为完成加密消息传递,甲乙双方需要以下操作: 1).由消息发送方(甲方)构建密钥对. 2).由消息发送方(甲方)公布公钥至消息接收方(乙方). 完成这两步操作后,甲乙双方就 ...

最新文章

  1. MySQL 学习笔记(6)— 存储过程创建、调用、删除以及带参数的存储过程
  2. R语言使用ggplot2可视化堆叠条形图,并在堆叠条形图上显示数据值实战
  3. 计算机应用论文2500字,计算机应用论文2500字:计算机基础.doc
  4. linux 服务器 安装网卡驱动,linux下安装编译网卡驱动的方法
  5. 4、Node.js REPL(交互式解释器)
  6. python做些什么项目内容_现在比较流行的python做什么项目最适合?
  7. 特斯拉又有新游戏可以玩了 网友:行车打游戏,亲人两行泪
  8. C++多继承构造和析构顺序
  9. aria-hidden读屏
  10. Flutter功能 组件描边,圆角
  11. ExtJs 入门教程
  12. DW制作小三角型教程
  13. day10、1 - 扫描与爆破
  14. POI 导出Excel文件 设置指定列格式为文本格式
  15. vmware虚拟机linux重置密码
  16. python爬网络图片脚步_关于python:如何从本地计算机或网络资源将图像或图片嵌入jupyter笔记本中?...
  17. APP的文件数据直传腾讯云COS实践
  18. 参考文献的类型--参考文献里的J、M等字母都代表什么
  19. 手机抓包+注入黑科技HttpCanary——最强大的Android抓包注入工具
  20. 《计算机网络-自顶向下》04. 网络层-数据平面

热门文章

  1. 史上最全Spring面试71题与答案
  2. 阿里P8架构师谈:Dubbo的详细介绍、设计思路、以及4大适用场景
  3. 征文 | 2022年全国知识图谱与语义计算大会(CCKS 2022) 征稿通知
  4. 论文浅尝 - ACL2020 | 用于回答知识库中的多跳复杂问题的查询图生成方法
  5. 论文浅尝 - WSDM20 | 基于弱监督及逐步推理的多关系知识图谱问答
  6. CONTINUE...? ZOJ - 4033
  7. select默认下拉箭头改变、option样式清除
  8. Oracle中如何查询一个表的所有字段名和数据类型
  9. yum list失败
  10. 函数指针 如:void (*oper)(ChainBinTreee *p)