亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

TripleDES加密在java中工作正常,但在c中不起作用#

TripleDES加密在java中工作正常,但在c中不起作用#

C#
蝴蝶不菲 2022-08-20 15:12:46
我在進行三重DES加密時面臨弱密鑰錯誤。代碼在java中工作正常,但在C# .net中給出錯誤。我有Java代碼,其中TripleDES ecryption工作正常,我需要在c#中轉換我的Java代碼。我在轉換過程中面臨弱鍵錯誤。下面給出了java和c#代碼。1) Java 代碼public class TripleDES {    private DESedeKeySpec desKeySpec;    public TripleDES(String key) {        try {            byte[] keyBytes = { (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,                    (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,                    (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,                    (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,                    (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02,                    (byte) 0x02, (byte) 0x02, (byte) 0x02, (byte) 0x02};            this.desKeySpec = new DESedeKeySpec(keyBytes);        } catch (Exception e) {            e.printStackTrace();        }    }    public byte[] encrypt(byte[] origData) {        try {            SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");            SecretKey key = factory.generateSecret(this.desKeySpec);            Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");            cipher.init(Cipher.ENCRYPT_MODE, key);            return cipher.doFinal(origData);        }  catch (Exception e) {            e.printStackTrace();        }        return null;    }    public byte[] decrypt(byte[] crypted) {        try {            SecretKeyFactory factory = SecretKeyFactory.getInstance("DESede");            SecretKey key = factory.generateSecret(this.desKeySpec);            Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");  //DESede/CBC/PKCS5Padding            cipher.init(Cipher.DECRYPT_MODE, key);            return cipher.doFinal(crypted);        }  catch (Exception e) {            e.printStackTrace();        }        return null;    }}密鑰:02020202020202020202020202020202數據 : 041205FFFBA666CF結果 : A334C92CEC163D9F任何人都可以用c#編寫代碼,產生與java相同的結果。
查看完整描述

2 回答

?
牧羊人nacy

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


查看完整回答
反對 回復 2022-08-20
?
米琪卡哇伊

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;


查看完整回答
反對 回復 2022-08-20
  • 2 回答
  • 0 關注
  • 153 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號