AES 加密解密HTTP传输乱码问题

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: AES 加密解密HTTP传输乱码问题

在做项目使用 AES加密串作为TOKEN时遇到一个问题 ==,而且是在服务器上才会出现。加密好好的解密后数据乱码的问题。 因为加解密这些东西都是直接拿网上写的算法,具体里面的方法没有研究透彻,更别说去改了==。首先没想到是乱码的问题,只是解密返回过来的JSON串(因为加密数据就是JSON)在回转的时候一直回转失败。用的是阿里的fastJson ,难道是这个包有问题?然后排查发现,在断点进入后发现加密过后的数据回传过来后乱码了。。。。。所以初步判定是 乱码导致 JSON 回转失败。。。

然后将加密解密方法中的所有String.getBytes()方法全部指定 UTF-8 而且new String(bytes[],"UTF-8"),全部指定为UTF-8,测试。不行,还是乱码,上网查找资料,发现好多人都会出现,因为AES的加密是有要求的, 由于AES加密算法要求密文是16位的倍数所以会有信息的填充,猜测是在填充的数据中,解密时出现了问题。而且所有的的加密解密在经过转换后最后的状态都是 bytes[]数组,展现出来的字符状态都是经过处理的(大部分时base64的加密转换),而base64字符在网络传输中有可能特殊字符会经过转义,目前发现的就有加号被转换成了空格==。猜测也有可能是这个原因导致失败。(但是不应该时解密失败嘛,为啥会转换成特殊字符)。使用加密解密时,别人都是汉字转换会成为特殊字符,我这里是 数字和字母==。根据大神给出的信息,重新定义AES的加密解密类,并且将加密返回的字符串改成16进制,这样就只会存在字母和数字,就是将加密返回的bytes[]转成16进制而不是base64,这样,会解决掉解密后出现字符乱码的问题。(同样的在网络传输中因为特殊字符被转换的问题也会被解决掉)代码:

packagecom.tl.handlpower.util;
importorg.apache.commons.codec.binary.Base64;
importorg.apache.commons.lang3.StringUtils;
importsun.misc.BASE64Decoder;
importjavax.crypto.*;
importjavax.crypto.spec.SecretKeySpec;
importjava.io.UnsupportedEncodingException;
importjava.security.InvalidKeyException;
importjava.security.NoSuchAlgorithmException;
importjava.security.SecureRandom;
/*** AESUtils** @author mjx* @date 2020/4/15*/publicclassAESUtils {
/*** 密钥*///    public static final String KEY = "1234567887654321";// AES加密要求key必须要128个比特位(这里需要长度为16,否则会报错)/*** 加密** @param content*            需要加密的内容* @param password*            加密密码* @return*/publicstaticbyte[] encrypt(Stringcontent, Stringpassword) {
try {
KeyGeneratorkgen=KeyGenerator.getInstance("AES");
kgen.init(128, newSecureRandom(password.getBytes()));
SecretKeysecretKey=kgen.generateKey();
byte[] enCodeFormat=secretKey.getEncoded();
SecretKeySpeckey=newSecretKeySpec(enCodeFormat, "AES");
Ciphercipher=Cipher.getInstance("AES");// 创建密码器byte[] byteContent=content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result=cipher.doFinal(byteContent);
returnresult; // 加密        } catch (NoSuchAlgorithmExceptione) {
e.printStackTrace();
        } catch (NoSuchPaddingExceptione) {
e.printStackTrace();
        } catch (InvalidKeyExceptione) {
e.printStackTrace();
        } catch (UnsupportedEncodingExceptione) {
e.printStackTrace();
        } catch (IllegalBlockSizeExceptione) {
e.printStackTrace();
        } catch (BadPaddingExceptione) {
e.printStackTrace();
        }
returnnull;
    }
/*** 解密** @param content*            待解密内容* @param password*            解密密钥* @return*/publicstaticbyte[] decrypt(byte[] content, Stringpassword) {
try {
KeyGeneratorkgen=KeyGenerator.getInstance("AES");
kgen.init(128, newSecureRandom(password.getBytes()));
SecretKeysecretKey=kgen.generateKey();
byte[] enCodeFormat=secretKey.getEncoded();
SecretKeySpeckey=newSecretKeySpec(enCodeFormat, "AES");
Ciphercipher=Cipher.getInstance("AES");// 创建密码器cipher.init(Cipher.DECRYPT_MODE, key);// 初始化byte[] result=cipher.doFinal(content);
returnresult; // 加密        } catch (NoSuchAlgorithmExceptione) {
e.printStackTrace();
        } catch (NoSuchPaddingExceptione) {
e.printStackTrace();
        } catch (InvalidKeyExceptione) {
e.printStackTrace();
        } catch (IllegalBlockSizeExceptione) {
e.printStackTrace();
        } catch (BadPaddingExceptione) {
e.printStackTrace();
        }
returnnull;
    }
/*** 将二进制转换成16进制** @param buf* @return*/publicstaticStringparseByte2HexStr(bytebuf[]) {
StringBuffersb=newStringBuffer();
for (inti=0; i<buf.length; i++) {
Stringhex=Integer.toHexString(buf[i] &0xFF);
if (hex.length() ==1) {
hex='0'+hex;
            }
sb.append(hex.toUpperCase());
        }
returnsb.toString();
    }
/*** 将16进制转换为二进制** @param hexStr* @return*/publicstaticbyte[] parseHexStr2Byte(StringhexStr) {
if (hexStr.length() <1) {
returnnull;
        }
byte[] result=newbyte[hexStr.length() /2];
for (inti=0; i<hexStr.length() /2; i++) {
inthigh=Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
intlow=Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
result[i] = (byte) (high*16+low);
        }
returnresult;
    }
/*** 加密** @param content*            需要加密的内容* @param password*            加密密码* @return*/publicstaticbyte[] encrypt2(Stringcontent, Stringpassword) {
try {
SecretKeySpeckey=newSecretKeySpec(password.getBytes(), "AES");
Ciphercipher=Cipher.getInstance("AES/ECB/NoPadding");
byte[] byteContent=content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化byte[] result=cipher.doFinal(byteContent);
returnresult; // 加密        } catch (NoSuchAlgorithmExceptione) {
e.printStackTrace();
        } catch (NoSuchPaddingExceptione) {
e.printStackTrace();
        } catch (InvalidKeyExceptione) {
e.printStackTrace();
        } catch (UnsupportedEncodingExceptione) {
e.printStackTrace();
        } catch (IllegalBlockSizeExceptione) {
e.printStackTrace();
        } catch (BadPaddingExceptione) {
e.printStackTrace();
        }
returnnull;
    }
publicstaticvoidmain(String[] args) throwsUnsupportedEncodingException {
Stringcontent="我是shoneworn";
Stringpassword="12345678";
// 加密System.out.println("加密前:"+content);
byte[] encode=encrypt(content, password);
//传输过程,不转成16进制的字符串,就等着程序崩溃掉吧Stringcode=parseByte2HexStr(encode);
System.out.println("密文字符串:"+code);
byte[] decode=parseHexStr2Byte(code);
// 解密byte[] decryptResult=decrypt(decode, password);
System.out.println("解密后:"+newString(decryptResult, "UTF-8")); //不转码会乱码    }
/**** 解密* @Author: mjx* @DateTime: 2020/4/28 10:42* @Params: []* @Return java.lang.String*/publicstaticStringaesDecrypt(Stringdata, Stringkey) {
try {
returnnewString(decrypt(parseHexStr2Byte(data), key),"UTF-8");
        } catch (UnsupportedEncodingExceptione) {
e.printStackTrace();
        }
returnnull;
    }
/**** 加密* @Author: mjx* @DateTime: 2020/4/28 10:43* @Params: []* @Return java.lang.String*/publicstaticStringaesEncrypt(Stringdata,Stringkey) {
returnparseByte2HexStr(encrypt(data, key));
    }
}
目录
相关文章
|
3月前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
228 43
|
3月前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
|
4月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
13天前
|
网络协议 网络安全 网络虚拟化
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算
本文介绍了十个重要的网络技术术语,包括IP地址、子网掩码、域名系统(DNS)、防火墙、虚拟专用网络(VPN)、路由器、交换机、超文本传输协议(HTTP)、传输控制协议/网际协议(TCP/IP)和云计算。通过这些术语的详细解释,帮助读者更好地理解和应用网络技术,应对数字化时代的挑战和机遇。
50 3
|
2月前
|
存储 前端开发 NoSQL
拿下奇怪的前端报错(四):1比特丢失导致的音视频播放时长无限增长-浅析http分片传输核心和一个坑点
在一个使用MongoDB GridFS存储文件的项目中,音频和视频文件在大部分设备上播放时长显示为无限,而单独播放则正常。经调查发现,问题源于HTTP Range请求的处理不当,导致最后一个字节未被正确返回。通过调整请求参数,使JavaScript/MongoDB的操作范围与HTTP Range一致,最终解决了这一问题。此案例强调了对HTTP协议深入理解及跨系统集成时注意细节的重要性。
|
3月前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
3月前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
141 8
|
2月前
|
安全 测试技术 Go
Python 和 Go 实现 AES 加密算法的技术详解
Python 和 Go 实现 AES 加密算法的技术详解
96 0
|
4月前
|
JavaScript 前端开发 Java
JMETER也会遇到加密难题,一并处理中文响应乱码
本文讨论了在JMeter中处理加密数据和中文响应乱码的问题,提供了使用BeanShell后处理器进行AES加密的示例代码,说明了如何将自定义的jar包放入JMeter的lib/ext目录以扩展功能,并给出了解决中文乱码的几种方法。
47 1
JMETER也会遇到加密难题,一并处理中文响应乱码
|
3月前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
82 3
下一篇
无影云桌面