土豆攻城狮 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 素材场景中光线烘焙后灯光失效
    • ¥15 请教一下各位,为什么我这个没有实现模拟点击
    • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
    • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
    • ¥20 有关区间dp的问题求解
    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 保护模式-系统加载-段寄存器