【问题标题】:C# 3DES Encryption+Decryption (ECB+No padding+no IV)C# 3DES 加密+解密(ECB+无填充+无 IV)
【发布时间】:2015-09-03 20:56:25
【问题描述】:

我需要在 C# 中加密和解密一个字符串。 我设法为从 Java 服务接收到的字符串编写了正确的解码器 - 3DES、DESede/ECB/NoPadding。

现在,我有一些时间相应地对字符串进行编码。 下面是解密器(完美,无需任何改动)。

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

解密器:

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

加密器(需要更改):

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

【问题讨论】:

  • 请注意,您的加密非常不安全。
  • 运行这段代码会发生什么?
  • 解密器返回乱码
  • 这里有很多问题。密钥不应由字符串组成,如果密钥是随机的,您可能会丢失数据。不需要转换为十六进制,如果是,您应该在 binary 和十六进制 base 64 之间转换。直接从一种编码转换为另一种编码会遇到问题.

标签: c# cryptography 3des tripledes


【解决方案1】:

你需要移动

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) completely insecure

【讨论】:

  • 感谢您的回复。我在加密器之前编写解密器的原因是因为我需要“猜测”Java 开发人员使用哪种加密,因为他不知道如何解释自己。在我设法了解如何解密他的消息后,我不得不像他一样加密。我能够解决这个问题,我必须使用 PaddingMode.None,并使用“位转换”为 HEX。解决了这个问题。谢谢大家。
猜你喜欢
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2015-03-11
  • 1970-01-01
相关资源
最近更新 更多