python3.6 实现AES加密、解密(改版)

前言

之前写过一篇aes的加密文章,当时的写法还不太成熟,后续参考了另一个博主的博客后恍然大悟。在此附上地址:
http://blog.csdn.net/hh775313602/article/details/78991340

编码

#AES-demo

import base64
from Crypto.Cipher import AES

'''
采用AES对称加密算法
'''
# str不是16的倍数那就补足为16的倍数
def add_to_16(value):
    while len(value) % 16 != 0:
        value += '\0'
    return str.encode(value)  # 返回bytes
#加密方法
def encrypt_oracle():
    # 秘钥
    key = '123456'
    # 待加密文本
    text = 'abc123def456'
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #先进行aes加密
    encrypt_aes = aes.encrypt(add_to_16(text))
    #用base64转成字符串形式
    encrypted_text = str(base64.encodebytes(encrypt_aes), encoding='utf-8')  # 执行加密并转码返回bytes
    print(encrypted_text)
#解密方法
def decrypt_oralce():
    # 秘钥
    key = '123456'
    # 密文
    text = 'qR/TQk4INsWeXdMSbCDDdA=='
    # 初始化加密器
    aes = AES.new(add_to_16(key), AES.MODE_ECB)
    #优先逆向解密base64成bytes
    base64_decrypted = base64.decodebytes(text.encode(encoding='utf-8'))
    #执行解密密并转码返回str
    decrypted_text = str(aes.decrypt(base64_decrypted),encoding='utf-8').replace('\0','') 
    print(decrypted_text)

if __name__ == '__main__':
   # encrypt_oracle()
    decrypt_oralce()

总结

大体思想依旧没有变,用pyCryptodome模块带的aes先将秘钥,以及要加密的文本填充为16位,随后对aes产生的字节码进行base64位编码,转为字符串的形式即可,解密思想逆过来即可。先逆向解密base64成bytes,执行解密密并转码返回str,将多余位数的’\0’替换为空

发布了202 篇原创文章 · 获赞 292 · 访问量 60万+
展开阅读全文

aes解密后明文为乱码的问题

09-27

自己尝试使用aes的cbc模式加密字符串,并解密字符串,并在最后使用OpenSSl自带的获取错误消息函数,获取错误信息,显示在加密和解密的过程中没有报错,但是将最后的明文结果输出,得到的始终是乱码啊。下面为自己写的代码,请各位大神看看啊 1. 1. #define SIZE 1000 1. #define BITS 128 1. using namespace std; 1. int main() 1. { 1. char in[50]; 1. cin.get(in, 50); 1. AES_KEY* Enkey = new(std::nothrow) AES_KEY; 1. AES_KEY* Dekey = new(std::nothrow) AES_KEY; 1. if (Dekey == nullptr || Enkey == nullptr) 1. { 1. return 0; 1. } 1. char userkey[16]="123456789012345"; 1. for (int i=0;i<16;++i) 1. { 1. userkey[i] = 32 + i; 1. } 1. AES_set_encrypt_key((const unsigned char*)userkey, BITS, Enkey); 1. AES_set_decrypt_key((const unsigned char*)userkey, BITS, Dekey); 1. 1. unsigned char* szOutEn; 1. unsigned char* szOutDe; 1. unsigned char szIvec[16]; 1. int len; 1. len = 0; 1. if ((strlen(in)+1)%16 == 0) 1. { 1. len = strlen(in) + 1; 1. } 1. else 1. { 1. len = (strlen(in) / 16 + 1) * 16; 1. } 1. szOutEn = new(std::nothrow) unsigned char[len]; 1. szOutDe = new(std::nothrow) unsigned char[len]; 1. if (nullptr == szOutEn || nullptr == szOutDe) 1. { 1. return 0; 1. } 1. 1. AES_cbc_encrypt((const unsigned char*)in, szOutEn, len, Enkey, szIvec, AES_ENCRYPT); 1. cout << "加密后的密文为:" << szOutEn << endl; 1. AES_cbc_encrypt((const unsigned char*)szOutEn, szOutDe, len, Dekey, szIvec, AES_DECRYPT); 1. 1. unsigned long ulErr = ERR_get_error(); 1. char szErrMsg[1024] = { 0 }; 1. char* pszTmp = nullptr; 1. pszTmp = ERR_error_string(ulErr, szErrMsg); 1. cout << "解密后的密文为:" << szOutDe << endl; 1. cout << szOutEn << endl; 1. cout << "错误码:" << ulErr<<endl; 1. cout << szErrMsg << endl; 1. /*AES_encrypt_BaseEncond((const unsigned char*)in, Enkey); 1. AES_decrypt_BaseDecode("Encode.txt", Dekey);*/ 1. delete Enkey; 1. delete Dekey; 1. cin.get(); 1. return 0; 1. } 问答

前端jsencrypt加密,后端无法解密

05-28

## 前后端RSA加密 > 在做一个web安全登录的作业时,遇到前后端RSA加密问题。。 1. 后端 java 生成RSA密钥对,privateKey,publicKey 后端RSA是从帖子上抄的: (学习加密四spring boot 使用RSA+AES混合加密,前后端传递参数加解密)[https://blog.csdn.net/baidu_38990811/article/details/83540404] **使用PKCS8规范** ``` // 后端部分代码 RSA /** * 生成密钥对(公钥和私钥) * @return * @throws Exception */ public static Map<String, Object> genKeyPair() throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGen.initialize(INITIALIZE_LENGTH); KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map<String, Object> keyMap = new HashMap<String, Object>(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } /** * 私钥解密 * @param encryptedData 已加密数据 * @param privateKey 私钥(BASE64编码) * @return * @throws Exception */ public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception { byte[] keyBytes = Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Key privateK = keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateK); int inputLen = encryptedData.length; ByteArrayOutputStream out = new ByteArrayOutputStream(); int offSet = 0; byte[] cache; int i = 0; // 对数据分段解密 while (inputLen - offSet > 0) { if (inputLen - offSet > MAX_DECRYPT_BLOCK) { cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * MAX_DECRYPT_BLOCK; } byte[] decryptedData = out.toByteArray(); out.close(); return decryptedData; } ``` 2. 前端:vue+webpack - 从后端获取一个公钥**publicKey** - 使用jsencrypt 和 **publicKey**加密内容,得到String encrypted 3. 后端拿到传回的encrypted, 再解密时报错 ``` javax.crypto.BadPaddingException: Decryption error at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:383) at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:294) at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:363) at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389) at javax.crypto.Cipher.doFinal(Cipher.java:2222) at com.security.loginserver.Util.RSAUtils.decryptByPrivateKey(RSAUtils.java:126) at com.security.loginserver.Util.RSAUtils.decryptDataOnJava(RSAUtils.java:285) ``` ## 测试情况 1. 后端单独测试RSA加密解密,正常 2. 前端单独测试RSA加密解密,使用后端的publicKey和privatekey正常 3. 搜到的贴子说,原因是JSEncrypt使用pkcs1规范,后端java用了**PKCS8规范**,,,然后就无从下手了 4. 求助大佬 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 创作都市 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览