RSA算法java实现.docx

上传人:小飞机 文档编号:3165244 上传时间:2023-03-11 格式:DOCX 页数:13 大小:38.52KB
返回 下载 相关 举报
RSA算法java实现.docx_第1页
第1页 / 共13页
RSA算法java实现.docx_第2页
第2页 / 共13页
RSA算法java实现.docx_第3页
第3页 / 共13页
RSA算法java实现.docx_第4页
第4页 / 共13页
RSA算法java实现.docx_第5页
第5页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《RSA算法java实现.docx》由会员分享,可在线阅读,更多相关《RSA算法java实现.docx(13页珍藏版)》请在三一办公上搜索。

1、RSA算法java实现import java.math.BigInteger;import java.security.KeyFactory;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.NoSuchAlgorithmException;import java.security.interfaces.RSAPrivateKey;import java.security.interfaces.RSAPublicKey;import java.security.spec

2、.RSAPrivateKeySpec;import java.security.spec.RSAPublicKeySpec;import java.util.HashMap;import javax.crypto.Cipher;public class RSAUtils /* 生成公钥和私钥* throws NoSuchAlgorithmException */public static HashMap<String, Object> getKeys throws NoSuchAlgorithmExceptionHashMap<String, Object> map = new

3、 HashMap<String, ObjectKeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(RSA);keyPairGen.initialize(1024);KeyPair keyPair = keyPairGen.generateKeyPair;RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic;RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate;map.put(public, pu

4、blicKey);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 = ne

5、w 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私钥* 注意:

6、【此代码用了默认补位方式,为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);KeyFa

7、ctory 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 Strin

8、g 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;/ 加密数据长度 <= 模长-11String datas = splitString(data, key_len - 11);String mi = ;/如果明文长度大于模

9、长-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(C

10、ipher.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码长度:+bcd.length);/如果密文长度大于模长则要分组解密String ming = ;byte arrays = splitArray(bcd, key_len);for(byte arr : arrays)ming += new

11、 String(cipher.doFinal(arr);return ming;/* ASCII码转BCD码* */public static byte ASCII_To_BCD(byte ascii, int asc_len) byte bcd = new byteasc_len / 2;int j = 0;for (int i = 0; i < (asc_len + 1) / 2; i+) bcdi = asc_to_bcd(asciij+);bcdi = (byte) (j >= asc_len) ? 0x00 : asc_to_bcd(asciij+) + (bcdi <&

12、lt 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);elsebcd = (byte) (asc - 48);return bcd;/* BCD转字符串*/publ

13、ic static String bcd2Str(byte bytes) char temp = new charbytes.length * 2, val;for (int i = 0; i < bytes.length; i+) val = (char) (bytesi & 0xf0) >> 4) & 0x0f);tempi * 2 = (char) (val > 9 ? val + A - 10 : val + 0);val = (char) (bytesi & 0x0f);tempi * 2 + 1 = (char) (val > 9 ? val + A - 10

14、: 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 Stringx + z;String str = ;for (int i=0; i<x+z; i+) if (i=x+z-1 & y!=0) str = string.substri

15、ng(i*len, i*len+y);elsestr = string.substring(i*len, i*len+len);stringsi = 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)z = 1;byte arrays = new bytex+z;byte arr;for(int i=0; i<x+z; i+)arr = new byt

16、elen;if(i=x+z-1 & y!=0)System.arraycopy(data, i*len, arr, 0, y);elseSystem.arraycopy(data, i*len, arr, 0, len);arraysi = arr;return arrays;public static void main(String args) throws Exception / TODO Auto-generated method stubHashMap<String, Object> map = RSAUtils.getKeys;/生成公钥和私钥RSAPublicKey pu

17、blicKey = (RSAPublicKey) map.get(public);RSAPrivateKey privateKey = (RSAPrivateKey) map.get(private);/模String modulus = publicKey.getModulus.toString;/公钥指数String public_exponent = publicKey.getPublicExponent.toString;/私钥指数String private_exponent = privateKey.getPrivateExponent.toString;/明文String min

18、g = 123456789;/使用模和指数生成公钥和私钥RSAPublicKey pubKey = RSAUtils.getPublicKey(modulus, public_exponent);RSAPrivateKey priKey = RSAUtils.getPrivateKey(modulus, private_exponent);/加密后的密文String mi = RSAUtils.encryptByPublicKey(ming, pubKey);System.err.println(密文:+mi);/解密后的明文ming = RSAUtils.decryptByPrivateKey(mi, priKey);System.err.println(明文:+ming);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号