java中RSA加解密的实现

文章详细介绍了如何使用Java的RSA算法生成公钥和私钥,以及如何进行公钥加密和私钥解密操作,涉及KeyPairGenerator、BigInteger和Cipher类的使用。
摘要由CSDN通过智能技术生成

public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException{

HashMap<String, Object> map = new HashMap<String, Object>();

KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(“RSA”);

keyPairGen.initialize(1024);

KeyPair keyPair = keyPairGen.generateKeyPair();

RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();

RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

map.put(“public”, publicKey);

map.put(“private”, privateKey);

return map;

}

/**

  • 使用模和指数生成RSA公钥

  • 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA

  • /None/NoPadding】

  • @param modulus

  • @param exponent

  •        指数
    
  • @return

*/

public static RSAPublicKey getPublicKey(String modulus, String exponent) {

try {

BigInteger b1 = new BigInteger(modulus);

BigInteger b2 = new BigInteger(exponent);

KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);

return (RSAPublicKey) keyFactory.generatePublic(keySpec);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

  • 使用模和指数生成RSA私钥

  • 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA

  • /None/NoPadding】

  • @param modulus

  • @param exponent

  •        指数
    
  • @return

*/

public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {

try {

BigInteger b1 = new BigInteger(modulus);

BigInteger b2 = new BigInteger(exponent);

KeyFactory keyFactory = KeyFactory.getInstance(“RSA”);

RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);

return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

  • 公钥加密

  • @param data

  • @param publicKey

  • @return

  • @throws Exception

*/

public static String encryptByPublicKey(String data, RSAPublicKey publicKey)

throws Exception {

Cipher cipher = Cipher.getInstance(“RSA”);

cipher.init(Cipher.ENCRYPT_MODE, publicKey);

// 模长

int key_len = publicKey.getModulus().bitLength() / 8;

// 加密数据长度 <= 模长-11

String[] datas = splitString(data, key_len - 11);

String mi = “”;

//如果明文长度大于模长-11则要分组加密

for (String s : datas) {

mi += bcd2Str(cipher.doFinal(s.getBytes()));

}

return mi;

}

/**

  • 私钥解密

  • @param data

  • @param privateKey

  • @return

  • @throws Exception

*/

public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey)

throws Exception {

Cipher cipher = Cipher.getInstance(“RSA”);

cipher.init(Cipher.DECRYPT_MODE, privateKey);

//模长

int key_len = privateKey.getModulus().bitLength() / 8;

byte[] bytes = data.getBytes();

byte[] bcd = ASCII_To_BCD(bytes, bytes.length);

System.err.println(bcd.length);

//如果密文长度大于模长则要分组解密

String ming = “”;

byte[][] arrays = splitArray(bcd, key_len);

for(byte[] arr : arrays){

ming += new String(cipher.doFinal(arr));

}

return ming;

}

/**

  • ASCII码转BCD码

*/

public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) {

byte[] bcd = new byte[asc_len / 2];

int j = 0;

for (int i = 0; i < (asc_len + 1) / 2; i++) {

bcd[i] = asc_to_bcd(ascii[j++]);

bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++])) + (bcd[i] << 4));

}

return bcd;

}

public static byte asc_to_bcd(byte asc) {

byte bcd;

if ((asc >= ‘0’) && (asc <= ‘9’))

bcd = (byte) (asc - ‘0’);

else if ((asc >= ‘A’) && (asc <= ‘F’))

bcd = (byte) (asc - ‘A’ + 10);

else if ((asc >= ‘a’) && (asc <= ‘f’))

bcd = (byte) (asc - ‘a’ + 10);

else

bcd = (byte) (asc - 48);

return bcd;

}

/**

  • BCD转字符串

*/

public static String bcd2Str(byte[] bytes) {

char temp[] = new char[bytes.length * 2], val;

for (int i = 0; i < bytes.length; i++) {

val = (char) (((bytes[i] & 0xf0) >> 4) & 0x0f);

temp[i * 2] = (char) (val > 9 ? val + ‘A’ - 10 : val + ‘0’);

val = (char) (bytes[i] & 0x0f);

temp[i * 2 + 1] = (char) (val > 9 ? val + ‘A’ - 10 : val + ‘0’);

}

return new String(temp);

}

/**

  • 拆分字符串

*/

public static String[] splitString(String string, int len) {

int x = string.length() / len;

int y = string.length() % len;

int z = 0;

if (y != 0) {

z = 1;

}

String[] strings = new String[x + z];

String str = “”;

for (int i=0; i<x+z; i++) {

if (i==x+z-1 && y!=0) {

str = string.substring(ilen, ilen+y);

}else{

str = string.substring(ilen, ilen+len);

}

strings[i] = str;

}

return strings;

}

/**

*拆分数组

*/

public static byte[][] splitArray(byte[] data,int len){

int x = data.length / len;

int y = data.length % len;

int z = 0;

if(y!=0){
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

由于篇幅原因,就不多做展示了
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
…(img-SRWIwfFy-1713125241183)]

[外链图片转存中…(img-MPx6bmCf-1713125241183)]

[外链图片转存中…(img-5zpdVce1-1713125241184)]

[外链图片转存中…(img-ghfk1ATt-1713125241184)]

[外链图片转存中…(img-iPwIMDYQ-1713125241184)]

[外链图片转存中…(img-b58Guvb0-1713125241185)]

由于篇幅原因,就不多做展示了
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值