gpt4 book ai didi

c# - TCL AES <-> C# AES - Tcl 加密文本为 ASCII

转载 作者:太空宇宙 更新时间:2023-11-03 10:50:35 41 4
gpt4 key购买 nike

我是 TCL 的新手,在这里需要一些帮助。

我写了一个客户端/服务器应用程序:服务器在 C# (.Net 4.51) 中实现,客户端在 TCL 8.2 中实现。基本通信工作正常,现在我需要加密客户端和服务器之间传递的消息。不幸的是,SSL 不是一个选项,因为客户端不在我的控制范围内并且没有安装 SSL 库。

我选择 TclLib (1.15) Aes 实现来进行加密。

为了检查两侧的 Aes 设置是否正确,我进行了以下测试:

IV 是:“20140204_1231060”关键是:“QbPQiCOTmBzLgCc40ElxH2588jmRljmq”我的测试数据是“Hello World”。

每一方都能够解密他们的加密数据。

这是TCL代码:

proc ::orbylonCrypto::encrypt { keyData ivData clearText } {

set clearText [::aes::Pad $clearText 16];

set key [::aes::Init cbc $keyData $ivData];
set ciphertext [::aes::Encrypt $key $clearText];
::aes::Final $key

return [::aes::Hex $ciphertext];

}

proc ::orbylonCrypto::decrypt { keyData ivData ciphertext } {

set key [::aes::Init cbc $keyData $ivData];
set clearText [::aes::Decrypt $key [ binary format H* $ciphertext ]];
::aes::Final $key

return [ string trimright $clearText \0 ];

}
...

set clearText {Hello World};
set iv "20140204_1231060"
set key "QbPQiCOTmBzLgCc40ElxH2588jmRljmq"

set encrypted [::orbylonCrypto::encrypt $key $iv $clearText];
set decrypted [::orbylonCrypto::decrypt $key $iv $encrypted];

并给我这个“加密”值:“e9455ec1788f5431fd103694c235670f”

这是 C# 代码::

public static string Encrypt(string clearText, string key, string iv)
{
string encryptedString;
var keyBytes = getValidatedKey(key);
var ivBytes = getValidatedIV(iv);

//byte[] clearTextBytes = Encoding.ASCII.GetBytes(clearText);
byte[] clearTextBytes = Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
initializeAes(encryptor, keyBytes, ivBytes);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearTextBytes, 0, clearTextBytes.Length);
cs.Close();
}
encryptedString = bytesToHexString(ms.ToArray());
}
}
return encryptedString;
}

public static string Decrypt(string encryptedText, string key, string iv)
{
string encryptedString;
var keyBytes = getValidatedKey(key);
var ivBytes = getValidatedIV(iv);

byte[] encryptedBytes = hexStringToByteArray(encryptedText);
using (Aes encryptor = Aes.Create())
{
initializeAes(encryptor, keyBytes, ivBytes);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(encryptedBytes, 0, encryptedBytes.Length);
cs.Close();
}
// encryptedString = Encoding.ASCII.GetString(ms.ToArray());
encryptedString = Encoding.Unicode.GetString(ms.ToArray());
encryptedString = encryptedString.TrimEnd('\0');
}
}
return encryptedString;
}

private static void initializeAes(Aes aes, byte[] keyBytes, byte[] ivBytes)
{
aes.Padding = PaddingMode.Zeros;
aes.BlockSize = 128;
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;

aes.Key = keyBytes;
aes.IV = ivBytes;
}

private static byte[] getValidatedIV(string iv)
{
byte[] ivBytes = Encoding.ASCII.GetBytes(iv);
if (ivBytes.Length != 16)
{
throw new ArgumentException("The IV must have a length of 16 bytes.");
}
return ivBytes;
}

private static byte[] getValidatedKey(string key)
{
byte[] keyBytes = Encoding.ASCII.GetBytes(key);
if (keyBytes.Length != 32)
{
throw new ArgumentException("The Key must have a length of 32 bytes.");
}
return keyBytes;
}

...

string iv = "20140204_1231060";
string key = "QbPQiCOTmBzLgCc40ElxH2588jmRljmq";

string inClearText = "Hello World";

string encrypted = AesCryption.Encrypt(inClearText, key, iv);
string outClearText = AesCryption.Decrypt(encrypted, key, iv);

然后给我这个“加密”值:“1d080b143641984d7623fce65c8a551853e2d9189413e9895f72065fde17e479”

C#版本的输出是原来的两倍。

如果我在加密之前将 c# 端的输入数据转换为 ASCII,我将得到完全相同的输出,并且 TCL 实现能够解密它。我的理解是 TCL 是 unicode“感知”的,我未加密的消息作为纯文本在客户端和服务器之间传递,没有任何编码问题。

我不知道什么在这里删除编码。我有一种感觉,实现为

的“::aes::Hex”
proc ::aes::Hex {data} {
binary scan $data H* r
return $r
}

[ binary format H* $ciphertext ]

是这里的问题。但我对此不太确定。

非常感谢任何帮助!

最佳答案

根据 Donal Fellow 的提示查看我的 clearTextBytes,问题很明显。TCL 使用的不是 Unicode,而是 UTF-8。所以我需要在加密之前将 C# 文本转换为 UTF8,并在解密之后转换回来:

byte[] clearTextBytes = Encoding.UTF8.GetBytes(clearText);

decryptedString = Encoding.UTF8.GetString(ms.ToArray());

感谢提示!

关于c# - TCL AES <-> C# AES - Tcl 加密文本为 ASCII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21558252/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com