土豆攻城狮 2019-08-21 15:45
浏览 749

pythonAES加密使用CBC模式与JAVA的CBC加密结果不同!求解!

JAVA的AES加密示例
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class AesUtil {
private static final String KEY_ALGORITHM = "AES";
private static final String DEFAULT_CIPHER_ALGORITHM =
"AES/CBC/PKCS5Padding";
public static String encrypt(String strKey, String strIn) throws Exception {
SecretKeySpec skeySpec = getKey(strKey);
Cipher cipher = Cipher.getInstance(DEFAULT_CIPHER_ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(strKey.getBytes());
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(strIn.getBytes());
String aesResult = new String(Base64.getEncoder().encode(encrypted),
StandardCharsets.UTF_8);
return aesResult.replace("/", "_");

}
private static SecretKeySpec getKey(String strKey) throws Exception {
byte[] arrBTmp = strKey.getBytes();
byte[] arrB = new byte[16];
for (int i = 0; i < arrBTmp.length && i < arrB.length; i++) {
arrB[i] = arrBTmp[i];
}
return new SecretKeySpec(arrB, KEY_ALGORITHM);
}
}

这个是我用python写的AES加密
from Crypto.Cipher import AES
import base64
from time import sleep

class aescrypt:
def init(self, key, model, iv, encode_):
self.encode_ = encode_
self.model = {'ECB': AES.MODE_ECB, 'CBC': AES.MODE_CBC}[model]
self.key = self.add_16(key)

    if model == 'ECB':
        self.aes = AES.new(self.key, self.model)  # 创建一个aes对象
    elif model == 'CBC':
        self.aes = AES.new(self.key, self.model, iv, segment_size=128)  # 创建一个aes对象
    elif model == 'CFB':
        self.aes = AES.new(self.key, self.model)

这里的密钥长度必须是16、24或32

def add_16(self, par):
    par = par.encode(self.encode_)
    while len(par) % 16 != 0:
        par += b'n'
    return par

def aesencrypt(self, text):     # 此处text传入的值为cleartext
    text = self.add_16(text)
    print(text)
    self.encrypt_text = self.aes.encrypt(text)
    return base64.encodebytes(self.encrypt_text).decode().strip()

def aesdecrypt(self, text):
    text = base64.decodebytes(text.encode(self.encode_))
    self.decrypt_text = self.aes.decrypt(text)
    return self.decrypt_text.decode(self.encode_).strip('\0')

if name == '__main__':
keyy = input("输入密钥:")
cleartext = input("输入明文:")
pr = aescrypt(keyy, 'CBC', IV, 'utf8'),此处为加密模式及内容,IV
en_text = pr.aesencrypt(cleartext)
print('密文:', en_text)
print('明文:', pr.aesdecrypt(en_text))
这里我写了两个加密模式,上述代码已经换成同样的CBC模式加密

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 运筹学排序问题中的在线排序
    • ¥30 求一段fortran代码用IVF编译运行的结果
    • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
    • ¥15 lammps拉伸应力应变曲线分析
    • ¥15 C++ 头文件/宏冲突问题解决
    • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
    • ¥50 安卓adb backup备份子用户应用数据失败
    • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
    • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
    • ¥30 python代码,帮调试,帮帮忙吧