接口传输数据加密、解密、加签、验签(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("验证签名失败"); } }