java中RSA加解密的实现

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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

[外链图片转存中…(img-3K2ClhNT-1715718756045)]

[外链图片转存中…(img-1G85G1VN-1715718756045)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

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

  • 28
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值