JAVA实现RSA算法

1.关于RSA算法,主要就是要掌握好公钥和私钥的使用。首先,公钥是由N,E组成,私钥由N,D组成。那个下面我,先将java生成密钥对的方法写出来:
public void createRsaKeyPair(String length) {
try {
// 调用产生rsa算法
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(“RSA”);
// 设置产生RSA算法的密钥长度
keyPairGenerator.initialize(Integer.parseInt(length));
// 生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
// 获取私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
在这里要注意下,我们可以同过publicKey.getPublicExponent()这个方法得到E;通过publicKey.getModulus()或者privateKey.getModulus()得到N;或者通过privateKey.getPrivateExponent()得到D;在这里我要说明下,这里得到的E、N、D是十进制的数据,所以长度不会与以输入的长度一致,需将N转化为16进制,才能得到正确的长度,其长度等于密文长度;比如:如果是512,这N的16进制长度为128,密文长度也为128,即64个字节。
2.接下来我将下加密的实现,这里没什么好说的上代码
public String encryptRSA(String data) {
byte[] bs = null;
try {
RSAPublicKey publicKey = getPublicKey();
Cipher cipher = Cipher.getInstance(“RSA/ECB/NoPadding”);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
bs = cipher.doFinal(HexConversionUtil.hexToByte(data));
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (InvalidKeySpecException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return HexConversionUtil.Bytes2HexString(bs);
}
对RSA算法的新人来说,请注意下Cipher cipher = Cipher.getInstance(“RSA/ECB/NoPadding”);
在这里面的”RSA/ECB/NoPadding”会导致加密出来的结果是保持不变的,解密出来的数据长度以512为例,这解密出来的数据长度也为128,它会在原来加密数据前面添加0000,直到长度达到128为止。
但是,如果这里只使用“RSA”,加密出来的数据会一直改变,但是,解密出来的数据会直接是你的加密数据,比如:你加 密”002233448899“,解密出来就刚好是002233448899,不会在前面添加0000直到长度为128字节。
最后说一句,至于解密方法,就和加密方法没什么区别,只是将cipher.init(Cipher.ENCRYPT_MODE, publicKey);中的Cipher.ENCRYPT_MODE换成Cipher.DECRYPT_MODE就可以了。

注意:在将N,D转为16进制时,请使用BigInteger来处理。E转换16进制有问题,最好还是使用10进制

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值