我有一个使用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
我认为您的密钥可能全部为零,这是不允许的。 https://msdn.microsoft.com/en-us/library/system.security.cryptography.tripledes.isweakkey.aspx – sean
不完全是,在密钥的24个字节中,我只占用了8个,其余的是充满了零。但是,由于认证接口使用相同的密钥,但是在Java接口中,所以我无法更改密钥 –