由于遗留的C#.NET代码,我不能更改密钥和IV,它们只是它们本身。但我似乎找不到办法去做我需要做的事。我试过这个..。
strToEncrypt = "Please encrypt me."
ivStr = "AStringOfIV="
keyStr = "aKeyOfSomeKindThat+IWillNotShare"
cipher = DES3.new(keyStr, DES3.MODE_CFB, IV=ivStr)
encryptedStr = cipher.iv + cipher.encrypt(strToEncrypt)这告诉我"IV必须有8个字节长“。
我的不是,也不可能。所以很显然这行不通。我也试过这个:
m=hashlib.md5()
print(sys.getsizeof(iv))
m.update(bytes(keyStr, 'UTF-8'))
k = pyDes.triple_des(m.digest(),pyDes.CBC,IV=iv,padmode=pyDes.PAD_PKCS5)
encryptedStr = k.encrypt(strToEncrypt)这告诉我“无效的初始值(IV),必须是8个字节的倍数”。
我调整了ivStr变量,如上面所示,使用getsizeof()检查它,以查看会发生什么:
ivStr = "AStringOfIV===="我得到了同样的消息,“无效初始值(IV),必须是8个字节的倍数”。但是..。它是。这次又是什么?
我尝试以字节的形式直接传递它,无论是原始的ivStr还是64字节的字节,都带有额外的等号。
k = pyDes.triple_des(
keyStr,
mode=pyDes.CBC,
IV=bytes(ivStr, 'UTF-8'),
pad=None,
padmode=pyDes.PAD_PKCS5
)
encryptedStr = k.encrypt(strToEncrypt)我得到了同样的消息,“无效初始值(IV),必须是8个字节的倍数”。是我告诉你的!
我试过pyDes.CBC和pyDes.ECB,想知道这会不会有什么不同。我看不见。
根据下面评论中@ShadowRanger的建议,我将初始代码改为添加b64decode和b64encode,如下所示:
pyDes.triple_des(m.digest(),pyDes.CBC,IV=base64.b64decode(ivStr),padmode=pyDes.PAD_PKCS5)
encryptedStr = base64.b64encode(k.encrypt(strToEncrypt))这确实消除了我得到的8字节错误,并产生了一个字符串结果,但是,字符串结果与C#程序产生的结果不匹配,所以我还没有到达终点线。
作为参考,如果有用的话,将对我加密的字符串使用的C#.NET解密代码(以及最初用于加密它的旧C#.NET代码)如下:
using System;
using System.Security.Cryptography;
using System.Text;
namespace encryption
{
class Program
{
const string IV = "AStringOfIV=";
const string Key = "aKeyOfSomeKindThat+IWillNotShare";
public static string Encrypt(string data)
{
byte[] buffer = Encoding.UTF8.GetBytes(data);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
ICryptoTransform transform = tdes.CreateEncryptor(Convert.FromBase64String(Key), Convert.FromBase64String(IV));
byte[] result = transform.TransformFinalBlock(buffer, 0, buffer.Length);
string encrypted = BitConverter.ToString(result).Replace("-", "");
return encrypted;
}
public static string Decrypt(string data)
{
byte[] result = StringToByteArray(data);
TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
ICryptoTransform transform = tdes.CreateDecryptor(Convert.FromBase64String(Key), Convert.FromBase64String(IV));
byte[] originalBytes = transform.TransformFinalBlock(result, 0, result.Length);
string original = Encoding.UTF8.GetString(originalBytes);
return original;
}
public static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length / 2;
byte[] bytes = new byte[NumberChars];
using (var sr = new System.IO.StringReader(hex))
{
for (int i = 0; i < NumberChars; i++)
{
string thisByte = new string(new char[2] { (char)sr.Read(), (char)sr.Read() });
bytes[i] = Convert.ToByte(thisByte, 16);
}
}
return bytes;
}
static void Main(string[] args)
{
Console.WriteLine(Encrypt("397854"));
Console.WriteLine(Encrypt("397786"));
Console.WriteLine(Encrypt("70001948"));
Console.WriteLine(Encrypt("70001890"));
Console.WriteLine("Press enter to close...");
Console.ReadLine();
}
}
}上面的代码作为控制台应用程序运行时,会产生以下结果,我需要在python3中复制这些结果:
4B7389BB6DFE3AC7
39C739D51AC4FD13
BEB55BBC9430B83583E3E5E4E6C3799E
FD66F55347E715560C963B0EA181FB50因此,如何使用预定义的密钥和IV?在python3中进行TripleDES加密。
如果您能为我提供任何有用的帮助,我们将不胜感激!
发布于 2020-09-23 19:57:59
基于等于填充,我强烈怀疑您的IV是base64编码的。也许最初的API预期会接收到它base64编码?如果您执行base64.b64decode("AStringOfIV="),它会生成长度为8IV的b'\x01+k\x8ax\x0e|\x85',这可能会得到您想要的行为。
发布于 2020-09-23 21:28:01
确保对每个值使用正确的编码(Base64)和正确的操作模式(CBC)。
这是为我工作的python代码:
import pyDes
import base64
strToEncrypt = "Please encrypt me."
ivStr = "AStringOfIV="
keyStr = "aKeyOfSomeKindThat+IWillNotShare"
k = pyDes.triple_des(
base64.b64decode(keyStr),
mode=pyDes.CBC,
IV=base64.b64decode(ivStr),
padmode=pyDes.PAD_PKCS5
)
encryptedStr = k.encrypt(strToEncrypt)
k = pyDes.triple_des(
base64.b64decode(keyStr),
mode=pyDes.CBC,
IV=base64.b64decode(ivStr),
padmode=pyDes.PAD_PKCS5
)
decryptedStr = k.decrypt(encryptedStr)请注意,由于许多问题,此代码不安全:
https://stackoverflow.com/questions/64035325
复制相似问题