Java C#DESede对称ECB加密(我非常接近-字符略有不同)!
我必须匹配的输出来自JavaDesede,使用2005年的BouncyCastle Jar。。。我非常接近 下面是我的Java输出(这是正确的),后面是我的C输出。。。如果您在编辑器中查看,您将看到它们几乎匹配,除了在C中有一个正斜杠“/”在Java中有“%2F”和“%2D”,在C的末尾有一个“=”,Java有“%3D”。有什么想法吗?(我添加了空格以显示它们的匹配-但您只能在编辑器中看到它们。) F3e8sdZ%2F951RIGUIAVQFDLYWPTQLBWIK5TVFZITCXJCEMUPZD9WXP%2DZIBRF2J2DPPXYEXL2QU%3D(Java-正确) F3e8sdZ/951RIGIAVQFDLYWPTQLBWIK5TVFZITCXJCEMUPZD9WXP+DzIbrf2J2dPpXyEXL2QU=(C#-关闭?) 这是我的C#代码:Java C#DESede对称ECB加密(我非常接近-字符略有不同)!,java,c#,bouncycastle,3des,Java,C#,Bouncycastle,3des,我必须匹配的输出来自JavaDesede,使用2005年的BouncyCastle Jar。。。我非常接近 下面是我的Java输出(这是正确的),后面是我的C输出。。。如果您在编辑器中查看,您将看到它们几乎匹配,除了在C中有一个正斜杠“/”在Java中有“%2F”和“%2D”,在C的末尾有一个“=”,Java有“%3D”。有什么想法吗?(我添加了空格以显示它们的匹配-但您只能在编辑器中看到它们。) F3e8sdZ%2F951RIGUIAVQFDLYWPTQLBWIK5TVFZITCXJCEMUP
任何指导都将不胜感激!!!!我已经做了两个星期了,终于可以尝到胜利的滋味了(我想!?)您的Java输出似乎已经进行了额外的URL编码。您应该能够调用以匹配当前输出 Java输出似乎已被URL编码。我想你可以调用
System.Uri.EscapeDataString()
来匹配。“%2F”是“/”而“%2D”是“=”,删除编码。corse 3DE的编码不应该在新代码中使用,而应该在旧代码中转换为AES。@DanB很多事情可能会出现问题,我试着关注现在。如果你关心它,大写是编码结果,当它与输入不同时。是的,我知道,这是同一个老故事。我想我们将在2050年在遗留系统中使用3DES。
public static string DoubleTrippleDESede(string strToEncode, ref string symKey, ref ICryptoTransform cipher)
{
try
{
//byte[] input = Encoding.UTF8.GetBytes("DESede (3DES) Encryption in RAILO CFML");
byte[] input = Encoding.UTF8.GetBytes(strToEncode);
//byte[] key = Convert.FromBase64String("ru8femXhTm9jwdGdhb/4Sw==");
byte[] key = Convert.FromBase64String(symKey);
TripleDESCryptoServiceProvider algorithm = new TripleDESCryptoServiceProvider();
algorithm.Mode = CipherMode.ECB;
algorithm.BlockSize = 64;
algorithm.KeySize = 192; // 24 byte key
algorithm.Key = key; //Original
//algorithm.Key = key.CopyTo(algorithm.Key,)
cipher = algorithm.CreateEncryptor();
byte[] encrypted = cipher.TransformFinalBlock(input, 0, input.Length);
Debug.WriteLine("encrypted (.NET): {0}", Convert.ToBase64String(encrypted));
return Convert.ToBase64String(encrypted);
}
catch (Exception ex)
{
return ex.Message;
}
}