C#和TypeScript / Ionic填充错误之间的加密/解密

时间:2019-02-05 02:06:49

标签: c# ionic-framework encryption websocket cryptography

我可以使用一些帮助解决以下问题:我已经在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解析,但是仍然无法正常工作。

0 个答案:

没有答案