将C#解密转换为Python PyDes
我在把C#的代码转换成Python时遇到了问题。在Martijn的C#博客上,有一个很棒的加密/解密程序(见下文),但是我无法直接把它转换成Python版本的pyDes(见下文示例)。
public static string DecryptString(string Message, string Passphrase)
{
byte[] Results;
System.Text.UTF8Encoding UTF8 = new System.Text.UTF8Encoding();
// Step 1. We hash the passphrase using MD5
// We use the MD5 hash generator as the result is a 128 bit byte array
// which is a valid length for the TripleDES encoder we use below
MD5CryptoServiceProvider HashProvider = new MD5CryptoServiceProvider();
byte[] TDESKey = HashProvider.ComputeHash(UTF8.GetBytes(Passphrase));
// Step 2. Create a new TripleDESCryptoServiceProvider object
TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();
// Step 3. Setup the decoder
TDESAlgorithm.Key = TDESKey;
TDESAlgorithm.Mode = CipherMode.ECB;
TDESAlgorithm.Padding = PaddingMode.PKCS7;
// Step 4. Convert the input string to a byte[]
byte[] DataToDecrypt = Convert.FromBase64String(Message);
// Step 5. Attempt to decrypt the string
try
{
ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
}
finally
{
// Clear the TripleDes and Hashprovider services of any sensitive information
TDESAlgorithm.Clear();
HashProvider.Clear();
}
// Step 6. Return the decrypted string in UTF8 format
return UTF8.GetString( Results );
}
PyDES:
from pyDes import *
data = "Please encrypt my data"
k = des("DESCRYPT", ECB, "\0\0\0\0\0\0\0\0", pad=None, padmode=PAD_PKCS5)
d = k.encrypt(data)
print "Encrypted: %r" % d
print "Decrypted: %r" % k.decrypt(d)
assert k.decrypt(d, padmode=PAD_PKCS5) == dat
我修改了原来的pyDes,使用了ECB模式而不是CBC模式。现在没有任何字符串匹配,我快要崩溃了。请帮帮我!谢谢!
1 个回答
10
没关系——我搞定了。
如果你在pyDes里改这一行
print "Encrypted: %r" % d
改成
print "Encrypted: %r" % d.encode('base64')
那么代码就完全一致了。
为了对比,可以运行Martijn网站上的原始代码:[输出]
Message: This world is round, not flat, don't believe them! Password: secret Encrypted string: pafHnI124lxzCr+93COqxfgOTan8x9oPzX4R/PDYkBnrjufk0/7mesG5tmS2AU Pxna3z0jY+7II= Decrypted string: This world is round, not flat, don't believe them!
这是修改过的pyDes代码——你需要用md5Hash来填充密码
import md5
from pyDes import *
Msg = "This world is round, not flat, don't believe them!"
Password = "secret"
m=md5.new()
m.update(Password)
k = triple_des(m.digest() , ECB,padmode=PAD_PKCS5)
d = k.encrypt(Msg)
print "Encrypted: %r" % d.encode('base64')
print "Decrypted: %r" % k.decrypt(d)
assert k.decrypt(d, padmode=PAD_PKCS5) == Msg
输出结果是:
Encrypted: 'pafHnI124lxzCr+93COqxfgOTan8x9oPzX4R/PDYkBnrjufk0/7mesG5tmS2AUPxna3z 0jY+7II=\n' Decrypted: "This world is round, not flat, don't believe them!"
希望这对下一个人有帮助!!!!
谢谢
-D