前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布

RSA

作者头像
Dean0731
发布2020-09-16 10:47:49
8620
发布2020-09-16 10:47:49
举报
文章被收录于专栏:blog-技术博客blog-技术博客

RSA算法

非对称加密算法的一种

  • 随意选择两个大的质数p和q,p不等于q,计算N=pq。
  • 根据欧拉函数,不大于N且与N互质的整数個数為(p-1)(q-1)。
  • 选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1)。
  • 用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1))。 (d*e)%((p-1)(q-1))=1
  • 将p和q的记录销毁。
  • 以上内容中,(N,e)是公钥,(N,d)是私钥。
公钥对象转为String
代码语言:javascript
复制
	byte[] keyByte=(Key)publicKey.getEncoded();
	String key=Base64.getEncoder().encodeToString(keyByte); 
String 转公钥对象
代码语言:javascript
复制
	byte[] keyBytes = Base64.getDecoder().decode(key);   //衔接 先转换byte[]
	X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);        
	KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); //RSA算法      
	Key publicK = keyFactory.generatePublic(x509KeySpec);  
私钥转String
代码语言:javascript
复制
	byte[] keyByte=(Key)privateKey.getEncoded();
	String key=Base64.getEncoder().encodeToString(keyByte); 
String转私钥
代码语言:javascript
复制
	byte[] keyBytes = Base64.getDecoder().decode(key); //先转换byte[]
	PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);        
	KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);        
	Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);  

例:有A,B两人每人一对秘钥

prkA,pukA,prkB,pukB,A向B发送信息

  • A用B的公钥进行加密 Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, pukB); byte[]data = cipher.doFinal(data, 0, data.length()); //加密后数据(全为数字),encodetoString()转为字符, //注:也可以循环分段加密,需添加流,每段为一个byte[],写入流中(ByteArrayOutputStream),最后读出流中byte[]
  • A用A的私钥进行签名(写上名字) 注:sign为byte[]类型
代码语言:javascript
复制
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);  //签名算法     
signature.initSign(prkA);        
signature.update(data);   
signature.sign()返回签名byte[] 同上可转为字符串.
  • B用自己的私钥进行解密 同加密过程 注意加密返回byte 解密也需要byte
  • 根据解密内容,及A的公钥进行验证
代码语言:javascript
复制
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);        
signature.initVerify(publicKey);        
signature.update(data);   
signature.verify(Base64.getDecoder().decode(sign)); 
//注意验证时需提供解密内容,A的签名sign(注意String还是byte[]),以及A的公钥 返回boolean

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • RSA算法
  • 例:有A,B两人每人一对秘钥
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档