2 回答

TA貢獻1862條經驗 獲得超7個贊
在我開始之前,我想說的是,我不建議或認可您遵循這種方式來強制TripleDES使用它認為較弱的密鑰,但是,鑒于您僅將其用于解密,這里有一種使用反射的方法。
首先,您必須“強制”類獲取要使用的弱鍵。為此,我們使用反射來繞過對弱鍵的檢查,當您嘗試設置鍵 () 并直接設置成員變量時,將執行該檢查:TripeDESalg.Key = key
//alg.Key = key; - THIS IS REPLACED BY THE BELOW
FieldInfo keyField = alg.GetType().GetField("KeyValue", BindingFlags.NonPublic | BindingFlags.Instance);
keyField.SetValue(alg, key);
現在的鍵值將設置為弱鍵 (TripleDESalg.Key);
接下來,您有一個小錯誤,因為您忘記關閉填充:
alg.Mode = CipherMode.ECB;
alg.Padding = PaddingMode.None; // Add this, as the default padding is PKCS7
最后,在創建解密器時,將進一步檢查弱密鑰,因此我們必須再次使用反射來繞過檢查并創建ICryptoTransform:
// Comment out the below line and use the code below
// CryptoStream cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
ICryptoTransform Decryptor;
MethodInfo createMethod = alg.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
Decryptor = createMethod.Invoke(alg, new object[] { alg.Key, alg.Mode, alg.IV, alg.FeedbackSize, 1 }) as ICryptoTransform;
CryptoStream cs = new CryptoStream(ms, Decryptor, CryptoStreamMode.Write);
代碼現在將運行并接受弱密鑰,并執行您要查找的解密。
但是,在我看來,輸出并不是您所期望的:
?Data
"4aU3DcHkiCTEywpiewWIow=="
至少現在,盡管您可以對 .TripleDES

TA貢獻1998條經驗 獲得超6個贊
3DES 鍵是一個 24 字節值,它分為兩個三個 8 字節值:、 、 .key0key1key2
因為 3DES 是 DES_Encrypt(key2, DES_Decrypt(key1, DES_Encrypt(key0, data))) 任何時間都等于或算法簡化為 DES。這就是.NET的TripleDES正在警告你。key1key2key0
這里正確的測試應該考慮清除(或設置或修復)每個字節中的奇偶校驗位,但手揮的版本是:
SymmetricAlgorithm alg;
IEnumerable<byte> key0 = key.Take(8);
IEnumerable<byte> key1 = key.Skip(8).Take(8);
IEnumerable<byte> key2 = key.Skip(16);
if (key0.SequenceEquals(key1))
{
alg = DES.Create();
alg.Key = key2.ToArray();
}
else if (key1.SequenceEquals(key2))
{
alg = DES.Create();
alg.Key = key0.ToArray();
}
else
{
alg = TripleDES.Create();
alg.Key = key;
}
要更換兩個襯墊:
TripleDES alg = TripleDES.Create();
alg.Key = key;
- 2 回答
- 0 關注
- 153 瀏覽
添加回答
舉報