RSA加解密应用

来源:互联网 发布:淘宝店运营商靠谱吗 编辑:程序博客网 时间:2024/05/17 10:40

RSA加解密应用

1:获取秘钥对

/*** 获取秘钥对* @return 秘钥map*/public static Map<String, byte[]> generateKeyBytes() {    try {        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM);        keyPairGenerator.initialize(KEY_SIZE);        KeyPair keyPair = keyPairGenerator.generateKeyPair();        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();        Map<String, byte[]> keyMap = new HashMap<String, byte[]>();        keyMap.put(PUBLIC_KEY, publicKey.getEncoded());        keyMap.put(PRIVATE_KEY, privateKey.getEncoded());        return keyMap;    } catch (NoSuchAlgorithmException e) {        e.printStackTrace();    }    return null;}

2:还原公钥

/*** 还原公钥, X509EncodedKeySpec 用于构建公钥的规范 * @param keyBytes* @return*/public static PublicKey restorePublicKey(byte[] keyBytes) {    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);    try {        KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);        PublicKey publicKey = factory.generatePublic(x509EncodedKeySpec);        return publicKey;    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {        e.printStackTrace();    }    return null;}

3:还原私钥

/*** 还原私钥, PKCS8EncodedKeySpec 用于构建私钥的规范* @param keyBytes* @return*/public static PrivateKey restorePrivateKey(byte[] keyBytes) {    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);    try {        KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);        PrivateKey privateKey = factory.generatePrivate(pkcs8EncodedKeySpec);        return privateKey;    } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {        e.printStackTrace();    }    return null;}

4:加密

/*** 加密,三步走* @param key 公钥* @param plainText 私钥* @return*/public static byte[] RSAEncode(PublicKey key, byte[] plainText) {    try {        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);        cipher.init(Cipher.ENCRYPT_MODE, key);        return cipher.doFinal(plainText);    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException     |  IllegalBlockSizeException | BadPaddingException e) {        e.printStackTrace();    }    return null;}

5:解密

/*** 解密,三步走* @param key* @param encodedText* @return*/public static String RSADecode(PrivateKey key, byte[] encodedText) {    try {        Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);        cipher.init(Cipher.DECRYPT_MODE, key);        return new String(cipher.doFinal(encodedText));| IllegalBlockSizeException | BadPaddingException e) {        e.printStackTrace();    }    return null;}

6:测试

public static final String PUBLIC_KEY = "publicKey";public static final String PRIVATE_KEY = "privateKey";//RSA密钥长度必须是64的倍数 ,在512~65536之间 默认是1024public static final int KEY_SIZE = 1024;public static final String PLAIN_TEXT = "hello word";@Testpublic void testRSA(){    Map<String, byte[]> keyMap = generateKeyBytes();    // 加密    PublicKey publicKey = restorePublicKey(keyMap.get(PUBLIC_KEY));    System.out.println("public key: " + Base64.encode(publicKey.getEncoded()));    byte[] encodedText = RSAEncode(publicKey, PLAIN_TEXT.getBytes());    System.out.println("RSA encoded: " + Base64.encode(encodedText));    //解密    PrivateKey privateKey = restorePrivateKey(keyMap.get(PRIVATE_KEY));    System.out.println("private key: " + Base64.encode(publicKey.getEncoded()));    System.out.println("RSA decoded: " + RSADecode(privateKey, encodedText));}

7:测试结果

public key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzMfk9znh1dIMREw/uv08A74RqsDQFjGb2v5FIACHYYFHNSpriBL1B5TEQEay24kEucqF3ItmVWRz3YfgpMdYPwmaWAkPsp/sMiQTnfXJ6x2clSNGTI4BecMIcc0mtvMRufgd/hDgdFd+YTXUGELB+FSyZYqqOhdEaZxk0+BXXDwIDAQABRSA encoded: DtXp9oJ42XNfEPkR5JsdhZceGAVVWpkixgL34CjXTpFjO7gO2OQfmr3v0kV68kgCjJ8MftBYwDM71cLcwwAYKF9fMyTsIt+JQBp3i7zk4QUbG6u1zzKBH6f5erGVNKQIoZ3//++0YkUpAmipUDqVtu73Uha0gF7xyT2KoQzR4AQ=private key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzMfk9znh1dIMREw/uv08A74RqsDQFjGb2v5FIACHYYFHNSpriBL1B5TEQEay24kEucqF3ItmVWRz3YfgpMdYPwmaWAkPsp/sMiQTnfXJ6x2clSNGTI4BecMIcc0mtvMRufgd/hDgdFd+YTXUGELB+FSyZYqqOhdEaZxk0+BXXDwIDAQABRSA decoded: hello word
原创粉丝点击