【问题标题】:Encrypt the string In Typescript And Decrypt In C# using Advanced Encryption Standard Algorithm(AES)使用高级加密标准算法(AES)在 Typescript 中加密字符串并在 C# 中解密
【发布时间】:2017-05-30 23:44:30
【问题描述】:

我很难在 typescript 中实现加密,在 C# 中实现解密。在这里发布问题之前,我用谷歌搜索并找到了一些链接,但这些链接与 JavaScript 相关,而不是打字稿。

Encrypt in javascript and decrypt in C# with AES algorithm

encrypt the text using cryptojs library in angular2

How to import non-core npm modules in Angular 2 e.g. (to use an encryption library)?

我按照上面的链接,在我当前的应用程序中实现加密/解密概念。

这是我在myservice.ts中写的代码

    //import { CryptoJS } from 'node_modules/crypto-js/crypto-js.js';
    //import 'crypto-js';
    import * as CryptoJS from 'crypto-js';


    var key = CryptoJS.enc.Utf8.parse('7061737323313233');
    var iv = CryptoJS.enc.Utf8.parse('7061737323313233');
    var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("It works"), key,
        {
            keySize: 128 / 8,
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });

    var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

    console.log('Encrypted :' + encrypted);
    console.log('Key :' + encrypted.key);
    console.log('Salt :' + encrypted.salt);
    console.log('iv :' + encrypted.iv);
    console.log('Decrypted : ' + decrypted);
    console.log('utf8 = ' + decrypted.toString(CryptoJS.enc.Utf8));

myservice.ts 中添加上述代码行之前,我在 "crypto-js": "^3.1.9-1" 中添加了依赖项package.json 文件。

在package.json中添加上述依赖后,我成功恢复了包。但 CryptoJS 仍然在 myservice.ts 中显示错误,例如 can not found name as CryptoJS

您能否告诉我如何从节点模块导入 CryptoJS,并告诉我如何使用高级安全算法 (AES) 在 typescript 中加密字符串并在 C# 中解密相同的字符串?

普雷迪普

【问题讨论】:

  • typescript 是 javascript 的超集。所以曾经在 javascript 中有效的东西将在 typescript 中有效。
  • 谢谢,我知道 typescript 是 javascript 的超集,但是当在我的应用程序中添加上面的代码行时,我得到了“找不到名称为 CryptoJS”的异常。如果您想了解更多信息,请查看我更新的问题一次。
  • 为了测试互操作性,这可能很好,但不要像那样在生产中使用它。在该代码中,几乎所有你能以密码方式做错的事情都是错误的。
  • @CodesInChaos 您能否链接或描述执行 OP 尝试执行的操作的正确方法。我在生产环境中遇到了同样的问题。我需要在 ts 中加密一个 JSON 字符串并在 c# 中解密它。

标签: c# security angular typescript aes


【解决方案1】:
export const encryptedMessage = (data: string):any => { var result=CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(data), key,
    {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

    return result.toString();
}

export const decryptedMessage = (encrypted: string):any => {
    var result= CryptoJS.AES.decrypt(encrypted, key, {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

    return result.toString(CryptoJS.enc.Utf8);
}
//----
//This is how is used it!!
Or in the above example

var key = CryptoJS.enc.Utf8.parse('7061737323313233');
var iv = CryptoJS.enc.Utf8.parse('7061737323313233');
var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("It works"), key,
    {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });

var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
    keySize: 128 / 8,
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
//---This is how you extract the encrypted and decrypted strings
console.log('Encrypted :' + encrypted).toString();;
console.log('Decrypted :' + encrypted.toString(CryptoJS.enc.Utf8));

【讨论】:

    【解决方案2】:

    npm 安装 crypto-js

    //Inside imports of your TS file include 
    import * as CryptoJS from 'crypto-js';
    
    // Declare this key and iv values in declaration
    private key = CryptoJS.enc.Utf8.parse('4512631236589784');
    private iv = CryptoJS.enc.Utf8.parse('4512631236589784');
    
    // Methods for the encrypt and decrypt Using AES
    encryptUsingAES256() {
        var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse(JSON.stringify("Your Json Object data or string")), this.key, {
            keySize: 128 / 8,
            iv: this.iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        console.log('Encrypted :' + encrypted);
        this.decryptUsingAES256(encrypted);
        return encrypted;
    }
    
    decryptUsingAES256(decString) {
        var decrypted = CryptoJS.AES.decrypt(decString, this.key, {
            keySize: 128 / 8,
            iv: this.iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
        console.log('Decrypted : ' + decrypted);
        console.log('utf8 = ' + decrypted.toString(CryptoJS.enc.Utf8));
    
    }
    

    编码或解码的 C# 代码在这里。

    public class encr {
        public static string DecryptStringAES(string cipherText) {
            var keybytes = Encoding.UTF8.GetBytes("4512631236589784");
            var iv = Encoding.UTF8.GetBytes("4512631236589784");
    
            var encrypted = Convert.FromBase64String(cipherText);
            var decriptedFromJavascript = DecryptStringFromBytes(encrypted, keybytes, iv);
            return decriptedFromJavascript;
        }
        private static string DecryptStringFromBytes(byte[] cipherText, byte[] key, byte[] iv) {
            // Check arguments.
            if (cipherText == null || cipherText.Length <= 0) {
                throw new ArgumentNullException("cipherText");
            }
            if (key == null || key.Length <= 0) {
                throw new ArgumentNullException("key");
            }
            if (iv == null || iv.Length <= 0) {
                throw new ArgumentNullException("key");
            }
    
            // Declare the string used to hold
            // the decrypted text.
            string plaintext = null;
    
            // Create an RijndaelManaged object
            // with the specified key and IV.
            using(var rijAlg = new RijndaelManaged()) {
                //Settings
                rijAlg.Mode = CipherMode.CBC;
                rijAlg.Padding = PaddingMode.PKCS7;
                rijAlg.FeedbackSize = 128;
    
                rijAlg.Key = key;
                rijAlg.IV = iv;
    
                // Create a decrytor to perform the stream transform.
                var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
    
                try {
                    // Create the streams used for decryption.
                    using(var msDecrypt = new MemoryStream(cipherText)) {
                        using(var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) {
    
                            using(var srDecrypt = new StreamReader(csDecrypt)) {
                                // Read the decrypted bytes from the decrypting stream
                                // and place them in a string.
                                plaintext = srDecrypt.ReadToEnd();
    
                            }
    
                        }
                    }
                } catch {
                    plaintext = "keyError";
                }
            }
    
            return plaintext;
        }
    
        public static string EncryptStringAES(string plainText) {
            var keybytes = Encoding.UTF8.GetBytes("4512631236589784");
            var iv = Encoding.UTF8.GetBytes("4512631236589784");
    
            var encryoFromJavascript = EncryptStringToBytes(plainText, keybytes, iv);
            return Convert.ToBase64String(encryoFromJavascript);
        }
    
        private static byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv) {
            // Check arguments.
            if (plainText == null || plainText.Length <= 0) {
                throw new ArgumentNullException("plainText");
            }
            if (key == null || key.Length <= 0) {
                throw new ArgumentNullException("key");
            }
            if (iv == null || iv.Length <= 0) {
                throw new ArgumentNullException("key");
            }
            byte[] encrypted;
            // Create a RijndaelManaged object
            // with the specified key and IV.
            using(var rijAlg = new RijndaelManaged()) {
                rijAlg.Mode = CipherMode.CBC;
                rijAlg.Padding = PaddingMode.PKCS7;
                rijAlg.FeedbackSize = 128;
    
                rijAlg.Key = key;
                rijAlg.IV = iv;
    
                // Create a decrytor to perform the stream transform.
                var encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
    
                // Create the streams used for encryption.
                using(var msEncrypt = new MemoryStream()) {
                    using(var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
                        using(var swEncrypt = new StreamWriter(csEncrypt)) {
                            //Write all data to the stream.
                            swEncrypt.Write(plainText);
                        }
                        encrypted = msEncrypt.ToArray();
                    }
                }
            }
            // Return the encrypted bytes from the memory stream.
            return encrypted;
        }
    }
    

    【讨论】:

    • 是否需要保持相同的key和Iv值。给定的
    • 不,你可以保留任何你想要的钥匙。
    【解决方案3】:

    我遇到了类似的问题。我正在使用 Angular 4/Angular-Cli 1.0.0。什么对我有用:

    npm install crypto-js --save
    npm install @types/crypto-js --save
    

    在这两个命令之后,引用 angular-cli.json 文件中的 crypto-js 库,在 "scripts" 数组中。就我而言:

    "scripts": [
        "../node_modules/crypto-js/crypto-js.js"
      ]
    

    您会注意到,在 node_modules/@types 目录中,您将拥有一个 crypto-js 子目录。所以在你的代码中引用 node_modules/@types/crypto-js/index.d.ts 文件,使用triple-slash directive,所以编译器知道打字文件是编译所必需的该模块文件:

    /// <reference path="relative_path_to_cypto_folder/index.d.ts" />
    

    另外,您也可以使用“types”属性而不是“path”,因为您在 node_modules/@types 中引用了类型定义:

    /// <reference types="crypto-js" />
    

    之后,您可以完全按原样使用您的代码:

    /// <reference types="crypto-js" />
    
    import * as CryptoJS from 'crypto-js';
    
    
    var key = CryptoJS.enc.Utf8.parse('7061737323313233');
    var iv = CryptoJS.enc.Utf8.parse('7061737323313233');
    var encrypted = CryptoJS.AES.encrypt(CryptoJS.enc.Utf8.parse("It works"), key,
        {
            keySize: 128 / 8,
            iv: iv,
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7
        });
    
    var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
        keySize: 128 / 8,
        iv: iv,
        mode: CryptoJS.mode.CBC,
        padding: CryptoJS.pad.Pkcs7
    });
    
    console.log('Encrypted :' + encrypted);
    console.log('Key :' + encrypted.key);
    console.log('Salt :' + encrypted.salt);
    console.log('iv :' + encrypted.iv);
    console.log('Decrypted : ' + decrypted);
    console.log('utf8 = ' + decrypted.toString(CryptoJS.enc.Utf8));
    

    【讨论】:

    • 嗨 jpavel,如果我想将加密数据存储在 db 中,我该怎么做?
    • 是什么阻止你这样做?
    • 感谢您的回复。已成功将加密密码存储在 db 中。还有一个疑问 crypto.lib.WordArray.random(32).toString() 在这一行中出现错误,因为“哈希”类型上不存在属性“lib”。
    • @jpavel 嗨,我得到了解密文本和纯文本的不同值
    • 我可以将encrypted 发送到nodeJS 服务吗?
    猜你喜欢
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2020-09-05
    • 1970-01-01
    • 2013-06-22
    相关资源
    最近更新 更多