非对称加密算法之七

2021-12-10  本文已影响0人  喏喏2021

1. 概念

2. 示例

public class RSATest {
    public static class User {
        private String name; //姓名
        private PublicKey publicKey; //公钥
        private PrivateKey privateKey; //私钥
        public User(String name) throws NoSuchAlgorithmException {
            this.name = name;
            KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");
            kpGen.initialize(512); //密钥大小,也有1024,2048长度
            KeyPair keyPair = kpGen.generateKeyPair(); //生成自己的密钥对
            this.publicKey = keyPair.getPublic();
            this.privateKey = keyPair.getPrivate();
        }
        
        //公钥加密
        public byte[] encrypt(byte[] message) throws Exception {
            Cipher cipher = Cipher.getInstance("RSA");//指定算法
            cipher.init(cipher.ENCRYPT_MODE, this.publicKey); //加密模式,使用公钥
            return cipher.doFinal(message);
        }
        
        //私钥解密
        public byte[] decrypt(byte[] message) throws Exception {
            Cipher cipher = Cipher.getInstance("RSA"); //指定算法
            cipher.init(cipher.DECRYPT_MODE, this.privateKey); //解密模式,使用私钥
            return cipher.doFinal(message); //解密
        }
        
        //输出公钥私钥,密钥
        public void printInfo() {
            System.out.println("name:" + this.name);
            System.out.printf("公钥:%x\n",new BigInteger(1,this.publicKey.getEncoded()));
            System.out.printf("私钥:%x\n",new BigInteger(1,this.privateKey.getEncoded()));
        }
    }
    
    public static void main(String[] args) throws Exception {
        String message = "你好!";
        byte[] messageData = message.getBytes("UTF-8");
        
        User user = new User("小明");     
        //输出密钥对
        user.printInfo();
        
        //公钥加密信息
        byte[] encryptData = user.encrypt(messageData);
        
        //私钥解密信息
        byte[] decryptData = user.decrypt(encryptData);
        System.out.println("解密后内容:" + new String(decryptData,"UTF-8"));
    }
}
//====输出====
//name:小明
//公钥:
305c300d06092a864886f70d0101010500034b00304802410086ddfe7ffefbb5affb4525e302bf2334c150cf07ad67cc7525e967d1a8c6d8c5754915982fbd418b101802f168db7da410b477be5f71742c89151ece817a00390203010001
//私钥:
30820154020100300d06092a864886f70d01010105000482013e3082013a02010002410086ddfe7ffefbb5affb4525e302bf2334c150cf07ad67cc7525e967d1a8c6d8c5754915982fbd418b101802f168db7da410b477be5f71742c89151ece817a0039020301000102401c23b1782f518185285e331b7c7538f946e47f6dd0a679a86fb29570cf503de61705bf512d3f0e1926a4950305e9ae0dd047e783a3953506541c932467cd9c69022100d202c11db21f861eb41de47bad83a02164bb376fdbaf1dc106a8fa45ff9dbb1b022100a466acb7103d6718d8c7d6ccfeb0cb35cb5b3e84998909b510772a3e63a4b33b0221008ce9b8367abc583be5d360e9f3a52c1efbfdfad69d6b44e5add85805fbdc141d02203d876ffcd3c7275ed54375d1234167ccaa5f6bf694c005320f078a77ef332521022013262f95175427d9755cbe85eae63c06cb854b2b2c5423ea8e431d8eae930fe9
//解密后内容:你好!

大家可以发现私钥的长度要比公钥长很多!

上一篇 下一篇

猜你喜欢

热点阅读