2015-09-23 111 views
2

我有一個使用Java編寫的身份驗證過程,它將字符串加密到MD5中,並生成一個字符串,並且只接受該字符串的前8位數字。 在這個例子中,生成的字符串是「89a5c474」。C#指定的密鑰是'TripleDES'的已知弱密鑰,不能使用

然後我有下面這段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#中的控制檯應用程序中,我試圖複製上述代碼無濟於事,並返回錯誤信息「指定的密鑰是'TripleDES'的已知弱密鑰,無法使用。」

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"))); 
} 

我尋覓幾個來源,我已經在這個替代方案,應用程序成功設法生成我一把鑰匙跌跌撞撞,但遺憾的是它不與代碼,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

+0

我認爲您的密鑰可能全部爲零,這是不允許的。 https://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledes.isweakkey.aspx – sean

+0

不完全是,在密鑰的24個字節中,我只佔用了8個,其餘的是充滿了零。但是,由於認證接口使用相同的密鑰,但是在Java接口中,所以我無法更改密鑰 –

回答

相關問題