【发布时间】: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