java 加密之非對稱加密算法

簡介

對稱加密算法在加密和解密時使用的是同一個祕鑰;而非對稱加密算法需要兩個密鑰來進行加密和解密,這兩個祕鑰是公開密鑰(public key,簡稱公鑰)和私有密鑰(private key,簡稱私鑰)。

在非對稱加密中使用的主要算法有:RSA、Elgamal、揹包算法、Rabin、D-H、ECC等。


RSA

RSA是基於大數因子分解難題所實現的加密算法,並且RSA不只可以實現加密,還可以在數字簽名中使用。JDK實現的RSA密鑰長度在512~65536之間(64的整數倍),默認爲1024。

RSA 的 java 實現:

public class MyRSA {

    private static final String str = "i am guo feng";

    public static void main(String[] args) {

        try {
            //初始化密鑰
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            keyPairGenerator.initialize(512);
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
            RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

            //私鑰加密,公鑰解密的加密
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            Cipher cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            byte[] result = cipher.doFinal(str.getBytes());
            System.out.println(new BigInteger(1, result).toString(16));

            //私鑰加密,公鑰解密的解密
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());
            keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            result = cipher.doFinal(result);
            System.out.println(new String(result));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

打印:

8ab11533e870d8ebb8a5f255ca8e0a5bd38807a1989779d77ec6af27d4df0e1d5dea01026ee3cd349c8fa655d3d2be8bd588a5370126cf08278b6947d2111f2e
i am guo feng

公鑰加密,私鑰解密類似,使用場景時序圖如下:
這裏寫圖片描述
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章