接口传输数据加密、解密、加签、验签(AES,RSA,Sign)

接口传输数据加密、解密、加签、验签(AES,RSA,Sign)

理解公钥与私钥:https://songlee24.github.io/2015/05/03/public-key-and-private-key/

Demo

public static void testCert() {
        RSA rsa = new RSA();
        String publicKey = rsa.getPublicKeyBase64();
        String privateKey = rsa.getPrivateKeyBase64();

        /* 加密 */
        // 传输的数据
        String data = "data";
        // 加密的 key
        String key = RandomUtil.randomNumbers(16);
        // 根据生成的key构造 AES 加密算法(个人理解,key就像一把钥匙,解密的时候要用这把钥匙)
        AES aes = new AES(Mode.ECB, Padding.PKCS5Padding, key.getBytes());
        // 根据构造出来的 aes 加密算法对数据进行加密
        String encryptDataBase64 = aes.encryptBase64(data);


        // RSA 使用 公钥 进行签名加密
        RSA platRsa = new RSA(null, publicKey);
        // 使用 公钥 对加密数据的 key 进行加密(对数据加密的钥匙进行加密)
        String encryptKeyBase64 = platRsa.encryptBase64(key, KeyType.PublicKey);


        // 构建签名实例
        Sign appSign = new Sign(SignAlgorithm.SHA1withRSA, privateKey, publicKey);
        // 用私钥对信息生成数字签名 并 进行base64处理
        String signBase64 = Base64.encode(appSign.sign(data.getBytes()));
        System.out.println("sign:" + signBase64);
      
     发送:
     encryptDataBase64,加密后的数据
     encryptKeyBase64,加密后的key
     signBase64 ,签名给对方



/* 解密 */ // 使用公钥、私钥 构造 RSA实例 RSA appRsa = new RSA(privateKey, publicKey); // 解密、加密数据的 key key = appRsa.decryptStr(encryptKeyBase64, KeyType.PrivateKey); // 构建解密数据的实例 aes = new AES(Mode.ECB, Padding.PKCS5Padding, key.getBytes()); // 解密传输的数据 String plaintextData = aes.decryptStr(encryptDataBase64); // 构建 Sign 实例,验签使用 Sign platSign = new Sign(SignAlgorithm.SHA1withRSA, null, publicKey); // 用公钥检验数字签名的合法性 boolean verify = platSign.verify(plaintextData.getBytes(), Base64.decode(signBase64)); System.out.println("验证签名:" + verify); if (verify) { System.out.println("验证签名成功"); } else { System.out.println("验证签名失败"); } }

 

posted @ 2022-01-21 14:50  唐胜伟  阅读(1200)  评论(0编辑  收藏  举报