java - C#指定的 key 是 'TripleDES'的已知弱 key ,不能使用

标签 java c# tripledes

我有一个用 Java 编写的身份验证过程,它将一个字符串加密为 MD5 并生成一个字符串,并且只采用该字符串的前 8 位数字。 在此示例中,生成的字符串是 "89a5c474"。

之后,我有以下一段 Java 代码,我在其中使用了 TripleDesEncryption。

public static byte[] encrypt(byte[] keybyte, byte[] src) throws NoSuchAlgorithmException, NoSuchPaddingException, Exception 
{ 
    System.out.println("Key Byte " + byte2hex(keybyte) + "Key Byte Array" + keybyte);
    System.out.println("Key String " + byte2hex(src));
    SecretKey deskey = new SecretKeySpec(keybyte, DESede); 
    Cipher c1 = Cipher.getInstance(Algorithm); 
    c1.init(Cipher.ENCRYPT_MODE, deskey); 
    return c1.doFinal(src);
} 

public static void main(String[] args) 
{
        final byte[] rawKey = "89a5c474".getBytes(); 
        final byte[] keyBytes = new byte[24]; 
        for (int i = 0; i <rawKey.length; i++) 
        { 
            keyBytes[i] = rawKey[i]; 
        }

        for (int i = rawKey.length; i <keyBytes.length; i++) 
        { 
            keyBytes[i] = (byte)0; 
        }


        String szSrc = "20126303$4A6D9BD0DDD094B76C111577A49EB87A$Guest$PC$193.92.123.5$$Reserved$CTC";         
        byte[] encoded = null;

        try 
        {            
            encoded = encrypt(keyBytes, szSrc.getBytes());          
        } 
        catch (Exception e) 
        { 
            e.printStackTrace(); 
        }                       
}

这导致加密字节的字符串表示,我能够成功地通过平台进行身份验证。但是,由于我必须将我的代码部署到 C# 中的控制台应用程序中,我试图复制上述代码但无济于事,并返回错误“指定的 key 是‘TripleDES’的已知弱 key ,无法使用。”

    public static string AuthenticatePassword(string token, string hashPassword)
    {
                byte[] rawKey = UTF8Encoding.UTF8.GetBytes(hashPassword);
                byte[] keyBytes = new byte[24];



                for (var i = 0; i < rawKey.Length; ++i)
                {
                    keyBytes[i] = rawKey[i];
                }

                for (int i = rawKey.Length; i < keyBytes.Length; i++)
                {
                    keyBytes[i] = 0;
                }

                string keyString = "20126303$" + token + "$Guest$PC$193.92.123.5$$Reserved$CTC";

                return Encrypt(keyBytes, System.Text.Encoding.ASCII.GetBytes(keyString), rawKey, keyString);
    }
public static string Encrypt(byte[] keyBytes, byte[] keyString)
{

            try
            {
            TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();

            des.Key = keyBytes;
            des.Mode = CipherMode.ECB;
            des.Padding = PaddingMode.PKCS7;                
            ICryptoTransform ic = des.CreateEncryptor();
            byte[] enc = ic.TransformFinalBlock(keyString, 0, keyString.Length);
            }
            catch (Exception e)
            {
                Console.WriteLine("[Encryption Error] {0}", e.Message); 
            }
return string.Join(string.Empty, enc.Select(x => x.ToString("X2")));
}

我搜索了多个来源,偶然发现了这个解决方法,应用程序成功地为我生成了一个 key ,但不幸的是,它与 Java 生成的代码不一样。

        TripleDESCryptoServiceProvider sm = new TripleDESCryptoServiceProvider();
        MethodInfo mi = sm.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
        object[] Par = { EmptyKey, CipherMode.ECB, keyBytes, sm.FeedbackSize, 0 };
        ICryptoTransform trans = mi.Invoke(sm, Par) as ICryptoTransform;
        byte[] enc = trans.TransformFinalBlock(keyString, 0, keyString.Length);

Java = d68d8423eb01421e8f23c118d3aef6a6998d8f2a62ceb697377195aa979fe5e97141454716e6d6b41c56d0af296bc4d6ab2979c7d9233898baef5c9f38fa9fd286d8a6c2a2a4b6697d1eb7c

C# = FF9772125DC1E3A4C9B63DFD429FB3CDA43732331025F9B73A092A942121F6869C372AE40B0DB1991DB0FD04CE5924EB213B8F303721C79F8F4CCA384711B7E2ADCC862E0003E18EF3CC0DA2CD4B7488

最佳答案

我已经成功绕过并使用 Java 中使用的函数和构造函数在 C# 上重新创建了 3DES 加密。对于所有遇到此问题的人,您可以使用 Bouncy CaSTLe 的程序集并点击以下链接以获取更多信息:http://www.bouncycastle.org/csharp/http://www.go4expert.com/articles/bouncy-castle-net-implementation-triple-t24829/

关于java - C#指定的 key 是 'TripleDES'的已知弱 key ,不能使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32744456/

相关文章:

linux - DES 加密文件给出不同的结果

java - 将当前日期和时间附加到 XLSX 文件

java - 将读/写类合并到基本 GUI 登录中

c# - 调用 SendMessage (P/Invoke) 一直崩溃

javascript - Node.JS 中的 3des 加密返回无效的 IV 长度

c# - 与 C# 相比,Javascript 中的 TripleDES 实现不同

Java:创建一个新变量或进行多次相同的计算?

使用阻塞 I/O 的 Java 线程池服务器

c# - P/调用 const char 指针和 int 引用

c# - 为什么 Linq GroupBy 在 OrderBy 解散订单操作之后?