我可以使用一些帮助解决以下问题:我已经在C#下实现了WebSocket服务器,而Ionic是连接到该服务器的客户端。现在,我想对它们交换的消息进行加密。是的,可能会使用SSL / TLS,唯一的问题是Windows 10移动版(因此我的Lumia 950 XL)不以某种方式支持它(我无法通过Ionic或Edge浏览器获得它)。另一种方法是:加密自己。
以下问题:我的C#代码认为填充无效,无法删除。
我的C#代码:
public class Cryptography
{
public static string Encrypt(string clearData, string Key, string IV)
{
var dataBytes = Encoding.UTF8.GetBytes(clearData);
var ms = new MemoryStream();
var alg = Aes.Create();
alg.Key = Encoding.UTF8.GetBytes(Key);
alg.IV = Encoding.UTF8.GetBytes(IV);
var cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(dataBytes, 0, dataBytes.Length);
cs.Close();
var encryptedData = ms.ToArray();
return Convert.ToBase64String(encryptedData);
}
public static string Decrypt(string cipherData, string Key, string IV)
{
var dataBytes = Convert.FromBase64String(cipherData);
var ms = new MemoryStream();
var alg = Aes.Create();
alg.Key = Encoding.UTF8.GetBytes(Key);
alg.IV = Encoding.UTF8.GetBytes(IV);
var cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(dataBytes, 0, dataBytes.Length);
cs.Close();
var decryptedData = ms.ToArray();
return Encoding.UTF8.GetString(decryptedData);
}
}
我的离子代码(使用CryptoJS):
private key: string = "XQlO2LZNd7FM5hry";
private iv: string = "U8n0w2Lq3FXZKrL5";
constructor() { }
encode(value) {
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(value.toString()), this.key, {
iv: this.iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
decode(value) {
var decrypted = CryptoJS.AES.decrypt(value, this.key, {
iv: this.iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return decrypted.toString(CryptoJS.enc.Utf8);
}
如果我在C#中编码以下文本:
var encrypted = Cryptography.Encrypt("This is a test", "XQlO2LZNd7FM5hry", "U8n0w2Lq3FXZKrL5");
// == kiyiwC51qy3zQ6m8H/2cALa1SHEZQghJ/F1Kg4pSbfI=
并以离子形式解码:
var decrypted = this.crypto.decode("kiyiwC51qy3zQ6m8H/2cALa1SHEZQghJ/F1Kg4pSbfI=");
输出只是空的。如果我将文本编码为Ionic:
var encrypted = this.crypto.encode("This is a test");
// == U2FsdGVkX1+w4dPQP108XyHR5iOrnXP6Pb1g7M/ndyh3gxGz+2PeY1xclVCHzHfM
并在C#中解码:
var decrypted = Cryptography.Decrypt("U2FsdGVkX1+w4dPQP108XyHR5iOrnXP6Pb1g7M/ndyh3gxGz+2PeY1xclVCHzHfM", "XQlO2LZNd7FM5hry", "U8n0w2Lq3FXZKrL5");
“无效填充”的错误来自cs.Close()。
有人可以帮我吗?我想这是因为我正在用C#将其转换为Base64,因为据我所知,这是唯一的区别。但是我实际上需要将要发送/接收的字符串。我试图使用CryptoJS解析到base64或从base64解析,但是仍然无法正常工作。