c# 3DES加密+解密(ECB+无填充+无IV)



我需要加密和解密c#中的字符串。我已经设法为我从Java服务接收的字符串编写正确的解码器- 3DES, DESede/ECB/NoPadding.

现在,我有一些时间编码相应的字符串。下面是解密器(它是完美的,不需要任何更改)。

还附加了加密器,该加密器应该加密将使用附加的解密器解密的字符串。

decryptor:

public static string Decryptor240815B(string Message) /* Working */
{
    string cipher = Message.Replace(" ", "+");
    byte[] keyBytes;
    string cipherString = FromHexString(cipher);
    byte[] cipherBytes = Convert.FromBase64String(cipherString);
    keyBytes = UTF8Encoding.UTF8.GetBytes(seed);
    var tdes = new TripleDESCryptoServiceProvider();
    tdes.Key = keyBytes;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.None;
    ICryptoTransform transformation = tdes.CreateDecryptor();
    byte[] decryptedBytes = transformation.TransformFinalBlock(cipherBytes, 0, cipherBytes.Length);
    tdes.Clear();
    string response = UTF8Encoding.UTF8.GetString(decryptedBytes);
    return response;
}
public static string FromHexString(string hexString)
{
    var bytes = new byte[hexString.Length / 2];
    for (var i = 0; i < bytes.Length; i++)
    {
        bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
    }
    return Encoding.UTF8.GetString(bytes); 
}

encryptor (need change):

public static string Encrypt030915(string message)
{
    byte[] keyBytes = UTF8Encoding.UTF8.GetBytes(seed);
    //string hexedMSG = StringToHexString(message);
    byte[] textBytes = UTF8Encoding.UTF8.GetBytes(message);
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    ICryptoTransform cTransform = tdes.CreateEncryptor();
    tdes.Key = keyBytes;
    tdes.Mode = CipherMode.ECB;
    tdes.Padding = PaddingMode.None;
    byte[] resultArray = cTransform.TransformFinalBlock(textBytes, 0, textBytes.Length);
    tdes.Clear();
    string base64 = Convert.ToBase64String(resultArray);
    string retVal = FromBase64ToHEX(base64);
    return retVal;
    //byte[] ba = Encoding.UTF8.GetBytes(base64);
//    return ToHexString(resultArray); 
    //return ByteArrayToString030915(ba); 
}
private static string FromBase64ToHEX(string base64)
{
    char[] c = new char[base64.Length * 2];
    byte b;
    for (int i = 0; i < base64.Length; ++i)
    {
        b = ((byte)(base64[i] >> 4));
        c[i * 2] = (char)(b > 9 ? b + 0x37 : b + 0x30);
        b = ((byte)(base64[i] & 0xF));
        c[i * 2 + 1] = (char)(b > 9 ? b + 0x37 : b + 0x30);
    }
    return new string(c);
}

你需要移动

ICryptoTransform transformation = tdes.CreateDecryptor();
下面的

行设置参数,因为CreateDecryptor使用的参数(与Key一样!)与TripleDESCryptoServiceProvider上当前设置的参数相同。但是在原始代码中,您创建了解密器,然后才设置了解密参数,这些参数根本不会用到(解密器使用的是随机密钥)。用

替换相关行
var tdes = new TripleDESCryptoServiceProvider();
tdes.Key = keyBytes;
tdes.Mode = CipherMode.ECB;
tdes.Padding = PaddingMode.None;
ICryptoTransform transformation = tdes.CreateDecryptor();

,它会工作。

但是,请注意您的代码是1)不必要的复杂,2)完全不安全的。

最新更新