本文档不讲解签名/加密相关的理论知识, 仅列出通过Java实现的方式.
待处理: Hutool含有很多工具的封装, 有时间需要好好研究一下(https://blog.csdn.net/moshowgame/article/details/80087954)
对称加密
加解密使用的是同一个秘钥
基于“对称密钥”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等。本文只介绍最常用的对称加密算法DES、3DES(TripleDES)和AES。
非对称加密
加解密使用的是不同的秘钥
基于“非对称密钥”的加密算法主要有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。
使用场景
在互联网后端技术中非对称加密技术主要用于登录、数字签名、数字证书认证等场景。
疑问: 既然堆成加密存在安全问题, 为什么还使用对称加密呢? ( 我同事告诉我, 当前功能不开放到外网, 使用对称加密即可 )
使用到的依赖包hutool
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.6.1</version> </dependency>
AES对称加密/解密
public String encryptAES(String data, String key) throws Exception { //生成一个随机秘钥 //byte[] keyRandom = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded(); //将秘钥转为Base64 //String keyRandomEncode = Base64.encode(keyRandom); key = "EC/Z+S7c3EFJa2dtvLyekg==";
//将Base64编码的秘钥的格式进行解码转换 byte[] keyByte = Base64.decode(key); //加密 AES aes = SecureUtil.aes(keyByte); //构建 byte[] encryptData = aes.encrypt(data); //加密 //加密后的数据转为Base64 String encryptDataEncode = Base64.encode(encryptData);
//将Base64编码加密数据和秘钥的格式进行解码转换 byte[] data2 = Base64.decode(encryptDataEncode); byte[] key2 = Base64.decode(key); //解密 AES aes2 = SecureUtil.aes(key2); byte[] decrypt = aes.decrypt(data2); return "秘钥: "+ key + ", 加密后的数据: "+ encryptDataEncode + ", 解密后的数据: "+ new String (decrypt); }
其他
@Overridepublic String dataSign(MsgForm msgForm) throws Exception { String ywData = msgForm.getData(); String prikeyYlf = msgForm.getPrivateKey(); msgForm.getKeyLen(); Sign sign = new Sign(SignAlgorithm.SHA1withRSA, prikeyYlf, null); byte[] encrypt = sign.sign(StrUtil.bytes(ywData, CharsetUtil.CHARSET_UTF_8)); return Base64.encode(encrypt); } @Overridepublic boolean verifySign(MsgForm msgForm) throws Exception { String ywData = msgForm.getData(); String signData = msgForm.getSignData(); String publicKey = msgForm.getPublicKey(); msgForm.getKeyLen(); Sign sign = new Sign(SignAlgorithm.SHA1withRSA, null, publicKey); boolean encrypt = sign.verify(StrUtil.bytes(ywData), Base64.decode(signData)); //return Base64.encode(encrypt); return encrypt; } @Overridepublic String encrypt(MsgForm msgForm) throws Exception { RSA rsa = new RSA(null, msgForm.getPublicKey()); byte[] encrypt = rsa.encrypt(StrUtil.bytes(msgForm.getData(), CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey); return Base64.encode(encrypt); } @Overridepublic String decrypt(MsgForm msgForm) throws Exception { RSA rsa = new RSA(msgForm.getPrivateKey(), null); byte[] decrypt = rsa.decrypt(Base64.decode(msgForm.getData()), KeyType.PrivateKey); return Base64.encode(decrypt); } @Overridepublic void dataReceive(MsgForm msgForm) throws Exception { SimpleDateFormat ft = new SimpleDateFormat("yyyyMMddHHmmsszzz"); StringBuffer filePath = new StringBuffer(Config.getProperty("download.path")); filePath.append("99_"); filePath.append(msgForm.getBusiCode()+"_"); //业务类型(6) filePath.append(ft.format(new Date())+"_"); //yyyyMMddhhmisszzz(17) filePath.append(new Random().nextInt(10)); //2位随机数 filePath.append(new Random().nextInt(10)); filePath.append(".XML"); //.XML //将数据写入到filePath FileWriter fw = new FileWriter(filePath.toString(),"UTF-8"); byte[] pdfData = Base64.decode(msgForm.getData()); fw.write(pdfData,0,pdfData.length); } @Overridepublic String encryptAES(String data, String key) throws Exception { //生成一个随机秘钥 //byte[] kkkkRandom = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded(); //将秘钥转为Base64 //key = Base64.encode(kkkkRandom); //key = "7Df05RgSzVm8/wWzUeTDaA=="; //将Base64编码的秘钥的格式进行解码转换 byte[] keyByte = Base64.decode(key); //加密 AES aes = SecureUtil.aes(keyByte); //构建 byte[] encryptData = aes.encrypt(data); //加密 //加密后的数据转为Base64 return Base64.encode(encryptData); } @Overridepublic String decryptAES(String data, String key) throws Exception { //key = "7Df05RgSzVm8/wWzUeTDaA=="; //将Base64编码加密数据和秘钥的格式进行解码转换 byte[] dataByte = Base64.decode(data); byte[] keyByte = Base64.decode(key); //解密 AES aes = SecureUtil.aes(keyByte); //构建 byte[] decrypt = aes.decrypt(dataByte); //加密 return new String (decrypt); //转换为字符串返回 }
原文:https://www.cnblogs.com/jkfeng/p/11847112.html