我想在 Python 3 中解密一个 AES 加密的字符串(CCM 模式)。
以下使用sjcl库的 JavaScript 代码工作正常:
const sjcl = require('sjcl');
const key = "ef530e1d82c154170296467bfe40cdb47b9ad77e685bbf8336b145dfa0e85640";
const keyArray = sjcl.codec.hex.toBits(key);
const iv = sjcl.codec.base64.fromBits(sjcl.codec.hex.toBits(key.substr(0,16)));
const params = {
"iv": iv,
"v": 1,
"iter": 1000,
"ks": 256,
"ts": 128,
"mode": "ccm",
"adata": "",
"cipher": "aes",
"salt": "",
};
function encrypt(data) {
const ct = JSON.parse(sjcl.encrypt(keyArray, data, params)).ct;
return sjcl.codec.hex.fromBits(sjcl.codec.base64.toBits(ct));
}
function decrypt(data) {
const ct = sjcl.codec.base64.fromBits(sjcl.codec.hex.toBits(data));
const paramsWithCt = JSON.stringify({ ...params, ...{ "ct": ct } });
return sjcl.decrypt(keyArray, paramsWithCt);
}
let ct = encrypt("my secret string");
console.log("Cipher Text: " + ct);
let plain = decrypt(ct);
console.log("Plain Text: " + plain);
输出:
$ npm i sjcl
$ node index.js
Cipher Text: fa90bcdedbfe7ba89b69216e352a90fa57a63871fc4da7e69ab7f897f427f8e3
Plain Text: my secret string
我可以使用哪个库在 Python 中做同样的事情?
我尝试使用pycryptodome 库,但它接受一组不同的参数:
- 密钥(字节)– 加密密钥
- mode – 常量 Crypto.Cipher.<algorithm>.MODE_CCM
- nonce (bytes) – 固定随机数的值。对于组合消息/密钥,它必须是唯一的。对于 AES,它的长度从 7 到 13 个字节不等。nonce 越长,允许的消息大小越小(nonce 为 13 字节,消息不能超过 64KB)。如果不存在,该库会创建一个 11 字节的随机 nonce(最大消息大小为 8GB)。
- mac_len (integer) – MAC 标签的所需长度(如果不存在,则默认为:16 字节)。
- msg_len (integer) – 预先声明要加密的消息长度。如果未指定,则 encrypt() 和 decrypt() 只能调用一次。
- assoc_len (integer) -- 关联数据长度的预先声明。如果未指定,将在内部进行一些额外的缓冲。