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));
    }
}
目录
相关文章
|
26天前
|
存储 安全 数据安全/隐私保护
打造安全防线!Python AES&RSA加密工具,黑客绕道走的秘籍
【9月更文挑战第9天】随着数字化时代的到来,信息安全问题日益凸显。本文将介绍如何使用Python结合AES与RSA两种加密算法,构建强大的加密工具。AES以其高效性和强安全性著称,适用于大量数据的快速加密;RSA作为非对称加密算法,在加密小量数据及实现数字签名方面表现卓越。通过整合两者,可以构建既安全又灵活的加密系统。首先,需要安装pycryptodome库。接着,实现AES加密与解密功能,最后利用RSA加密AES密钥,确保其安全传输。这种设计不仅提高了数据传输效率,还增强了密钥交换的安全性,为敏感数据提供坚实保护。
176 43
|
6天前
|
存储 安全 数据安全/隐私保护
浅谈对称加密(AES与DES)
浅谈对称加密(AES与DES)
14 1
|
2月前
|
存储 缓存 NoSQL
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题
|
9天前
|
数据安全/隐私保护
aes之ecb模式的加密解密
aes之ecb模式的加密解密
|
23天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
41 8
|
2月前
|
JavaScript 前端开发 Java
JMETER也会遇到加密难题,一并处理中文响应乱码
本文讨论了在JMeter中处理加密数据和中文响应乱码的问题,提供了使用BeanShell后处理器进行AES加密的示例代码,说明了如何将自定义的jar包放入JMeter的lib/ext目录以扩展功能,并给出了解决中文乱码的几种方法。
35 1
JMETER也会遇到加密难题,一并处理中文响应乱码
|
25天前
|
安全 算法 数据安全/隐私保护
深度揭秘!Python加密技术的背后,AES与RSA如何守护你的数据安全
【9月更文挑战第10天】随着数字化时代的到来,数据安全成为企业和个人面临的重大挑战。Python 作为功能强大的编程语言,在数据加密领域扮演着重要角色。AES 和 RSA 是两种主流加密算法,分别以对称和非对称加密方式保障数据安全。AES(Advanced Encryption Standard)因其高效性和安全性,在数据加密中广泛应用;而 RSA 则利用公钥和私钥机制,在密钥交换和数字签名方面表现卓越。
53 3
|
24天前
|
存储 安全 数据库
双重防护,无懈可击!Python AES+RSA加密方案,构建最强数据安全堡垒
【9月更文挑战第11天】在数字时代,数据安全至关重要。AES与RSA加密技术相结合,构成了一道坚固防线。AES以其高效性保障数据加密,而RSA则确保密钥安全传输,二者相辅相成,提供双重保护。本文通过Python代码示例展示了这一加密方案的魅力,强调了其在实际应用中的重要性和安全性。使用HTTPS等安全协议传输加密密钥和密文,确保数据在数字世界中自由流通而无忧。
42 1
|
27天前
|
安全 数据安全/隐私保护 Python
情书也能加密?Python AES&RSA,让每一份数据都充满爱的密码
【9月更文挑战第8天】在这个数字化时代,情书不再局限于纸笔,也可能以电子形式在网络中传递。为了确保其安全,Python提供了AES和RSA等加密工具,为情书编织爱的密码。首先,通过安装pycryptodome库,我们可以利用AES对称加密算法高效保护数据;接着,使用RSA非对称加密算法加密AES密钥和IV,进一步增强安全性。即使情书被截获,没有正确密钥也无法解读内容。让我们用Python为爱情编织一张安全的网,守护每份珍贵情感。
30 2
|
2月前
|
网络协议 安全 网络安全
DNS服务器加密传输
【8月更文挑战第18天】
95 15
下一篇
无影云桌面