python - 在 python 中加密消息时收到错误“无效的 DES 密钥大小。密钥必须正好是 8 个字节长”
问题描述
我有下面的java代码来编码一个带有密码的字符串
public static String encrypt(String message, String passkey) throws Exception {
final MessageDigest md = MessageDigest.getInstance("SHA-1");
final byte[] digestOfPassword = md.digest(passkey.getBytes("utf-8"));
final byte[] keyBytes = ( byte[])resizeArray(digestOfPassword, 24);
for (int j = 0, k = 16; j < 8;) {
keyBytes[k++] = keyBytes[j++];
}
final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, iv);
final byte[] plainTextBytes = message.getBytes("utf-8");
final byte[] cipherText = cipher.doFinal(plainTextBytes);
String encryptedString = Base64.encodeBase64String(cipherText);
return encryptedString;
}
现在我将相同的代码转换为python(Python 2.7),我尝试如下。
def encrypt(message, passkey):
hash_object = hashlib.sha1(passkey.encode("utf-8"))
digested_passkey = hash_object.digest() //hashing
key24 = "{: <24}".format(digested_passkey) // for resizing the byte array to size 24
import pyDes
des = pyDes.des(key24);(at this line I m getting the error "Invalid DES key size. Key must be exactly 8 bytes long".
message = message.encode('utf-8')
message = message + (16 - len(message) % 16) * chr(16 - len(message) % 16) // this is for padding
iv = Random.new().read(AES.block_size)
cipher = AES.new(des, AES.MODE_CBC, iv)
return base64.b64encode(iv + cipher.encrypt(message))
在 des = pyDes.des(key24) 行,我收到错误“无效的 DES 密钥大小。密钥必须正好是 8 个字节长。”
我作为参数发送的密码是“f!16 * hw $ sda66”如果des = pyDes.des(key24)行有任何问题,谁能告诉我
解决方案
我认为您收到此错误的原因是因为类初始化方法期望密钥正好是 8,如果它是其他任何东西,它会引发您看到的错误,这是您从 pyDes 调用的类的初始化:
# Initialisation
def __init__(self, key, mode=ECB, IV=None, pad=None, padmode=PAD_NORMAL):
# Sanity checking of arguments.
if len(key) != 8:
raise ValueError("Invalid DES key size. Key must be exactly 8 bytes long.")
如果你这样做是为了调试:
def encrypt(message, passkey):
hash_object = hashlib.sha1(passkey.encode("utf-8"))
digested_passkey = hash_object.digest() //hashing
key24 = "{: <24}".format(digested_passkey)
print len(key24)
您会看到密钥的长度是 24,这就是我认为它不被接受的原因。
我可能是错的,但乍一看,这似乎是问题所在。
推荐阅读
- xmlhttprequest - 为什么我们在使用 XMLHttpRequest 时必须设置 responseType?
- php - 使用自定义方法的雄辩查询
- javascript - JavaScript 中的简单去抖动函数
- javascript - 在javascript中的数组数组中查找值
- r - 抛硬币游戏中的无限循环
- javascript - vue-html-to-paper 样式未加载
- app-store - 特定国家/地区的 Appstore 自动续订订阅
- python - 导入 HMM 包时出错 (hmmlearn)
- python - 有没有办法在 Python 的 3DAxes plot_surface 中正确反转 y 轴而不干扰 x 轴?
- ios - QLPreviewController 播放项