RSA加解密应用

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之间 默认是1024
public static final int KEY_SIZE = 1024;
public static final String PLAIN_TEXT = "hello word";

@Test
public 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/uv08A74RqsDQFjGb2v5FI
ACHYYFHNSpriBL1B5TEQEay24kEucqF3ItmVWRz3YfgpMdYPwmaWAkPsp/sMiQTnfXJ6x2clSNGT
I4BecMIcc0mtvMRufgd/hDgdFd+YTXUGELB+FSyZYqqOhdEaZxk0+BXXDwIDAQAB

RSA encoded: DtXp9oJ42XNfEPkR5JsdhZceGAVVWpkixgL34CjXTpFjO7gO2OQfmr3v0kV68kgCjJ8MftBYwDM7
1cLcwwAYKF9fMyTsIt+JQBp3i7zk4QUbG6u1zzKBH6f5erGVNKQIoZ3//++0YkUpAmipUDqVtu73
Uha0gF7xyT2KoQzR4AQ=

private key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCzMfk9znh1dIMREw/uv08A74RqsDQFjGb2v5FI
ACHYYFHNSpriBL1B5TEQEay24kEucqF3ItmVWRz3YfgpMdYPwmaWAkPsp/sMiQTnfXJ6x2clSNGT
I4BecMIcc0mtvMRufgd/hDgdFd+YTXUGELB+FSyZYqqOhdEaZxk0+BXXDwIDAQAB

RSA decoded: hello word
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值