В настоящее время я работаю над шифрованием TripleDES на С#, для которого я получил образец кода от JAVA.
Я создал функцию шифрования на С# с приведенным ниже примером кода:
Входы: ключ/ekay = "15ce89cd1a2a838f4f6d49d60438251915ce89cd1a2a838f"
текст/данные = "00000000000000000"
public static string encryptionMethod(string Text, string key)
{
string encryptedText = string.Empty;
try
{
MD5CryptoServiceProvider md5Hash = new MD5CryptoServiceProvider();
byte[] md5Bytes = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(key));
md5Hash.Clear();
byte[] clearBytes = Encoding.UTF8.GetBytes(Text);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.KeySize = 128;
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.None;
des.Key = md5Bytes; //Passing key in byte array
//des.BlockSize = 64;
byte[] ivBytes = new byte[8] {0, 0, 0, 0, 0, 0, 0, 0 };
des.IV = ivBytes;
ICryptoTransform ct = des.CreateEncryptor(); //Interface with some result
byte[] resultArray = ct.TransformFinalBlock(clearBytes, 0, clearBytes.Length);
encryptedText = ByteArrayToHexString(resultArray);
}
catch (Exception exception)
{
return "";
}
return encryptedText;
}
public static string ByteArrayToHexString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * 2);
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
но после сравнения вывода С# с выводом JAVA я получил разные результаты.
JAVA-код
public static String encrypt(String data, String ekey) {
String encrypteddata = null;
try{
String key = ekey;
byte[] encryptKey = ISOUtil.hex2byte(key);
DESedeKeySpec spec = new DESedeKeySpec(encryptKey);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
SecretKey theKey = keyFactory.generateSecret(spec);
Cipher cipher = Cipher.getInstance("DESede/CBC/NoPadding");
IvParameterSpec IvParameters = new IvParameterSpec( new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 });
cipher.init(Cipher.ENCRYPT_MODE, theKey, IvParameters);
String plain = data;
byte[] plaintext = ISOUtil.hex2byte(plain);
byte[] encrypted = cipher.doFinal(plaintext);
encrypteddata= ISOUtil.byte2hex(encrypted);
}
catch(Exception e){
}
return encrypteddata;
}
выход :
С#: eca27a1e639900f3298a5090cc34dd29
ЯВА: c0a946402dd20f5e
Любая помощь будет оценена?
Спасибо.
DESede == TripleDES?
@bradbury9 Да, DES EDE означает шифрование-дешифрование-шифрование DES, описывающее операцию шифрования тройного DES (официально, я думаю, 3-DEA, но тройной DES — это псевдоним, признанный в стандарте, и все его используют).
У одного есть MD5, у другого нет. У одного есть шестигранник, у другого нет. Ты даже не пытающийся. Простое копирование кода, использующего тройной DES, не означает, что мы напишем код за вас.
Понял, спасибо !!





Вот модифицированный код, который решил мою проблему.
public static string encryptionMethod(string Text, string key)
{
string encryptedText = string.Empty;
try
{
byte[] clearBytes = StringToByteArray(Text); ;//Encoding.UTF8.GetBytes(Text);
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.KeySize = 128;
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.None;
des.Key = StringToByteArray(key); //Passing key in byte array
//des.BlockSize = 64;
byte[] ivBytes = new byte[8] { 0, 0, 0, 0, 0, 0, 0, 0 };
des.IV = ivBytes;
ICryptoTransform ct = des.CreateEncryptor(); //Interface with some result
byte[] resultArray = ct.TransformFinalBlock(clearBytes, 0, clearBytes.Length);
encryptedText = ByteArrayToHexString(resultArray);
}
catch (Exception exception)
{
return "";
}
return encryptedText;
}
public static byte[] StringToByteArray(string hex)
{
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
Поколения ключей разные. Примечание: c# добавляет IV.