Suc*_*a B 7 javascript c# aes node.js cryptojs
我有一个用例,必须使用 AES 256 算法对文本进行编码和发送。客户端代码在 C# 中,它将解密代码。
JS中的加密代码:
const crypto = require('crypto');
algorithm = 'aes-256-cbc',
secret = '1234567890123456',
keystring = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 16);
iv = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 16);
inputEncoding = 'utf8',
outputEncoding = 'base64';
function encrypt(text) {
let cipher = crypto.createCipheriv('aes-256-cbc', keystring, iv);
let encrypted = cipher.update(text, inputEncoding, outputEncoding)
encrypted += cipher.final(outputEncoding);
return encrypted;
}
Run Code Online (Sandbox Code Playgroud)
客户端使用的更新代码:
var keybytes = Encoding.UTF8.GetBytes(passwordKey);
var iv = Encoding.UTF8.GetBytes(passwordKey);
private byte[] EncryptStringToBytes(string plainText, byte[] key, byte[] iv)
{
try
{
// 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;
}
catch (Exception ex)
{
throw ex;
//LoggerCS.logError("Utility", "EncryptStringToBytes", JsonConvert.SerializeObject(null), ex.ToString(), ex.StackTrace);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
使用的 keyString 和 IV 值在 C# 中相同,并使用 Utf8 加密。在 Node JS 中寻找等效的操作。
决议比预期的要简单得多。keylen 128的RijndaelManaged代码引用了AES-128算法并在nodeJS中使用了aes-128-cbc。
另外,由于 C# 代码使用 getBytes 作为键和 iv 值。NodeJS 中的 key 和 iv value 必须使用 Buffer.from(secret) 。最终解决方案如下所示:
const crypto = require('crypto');
algorithm = "aes-128-cbc",
secret = '1234567890123456',
keystring = new Buffer(secret),
iv = new Buffer(secret),
inputEncoding = 'utf8',
outputEncoding = 'base64';
function encrypt(text) {
let cipher = crypto.createCipheriv(algorithm,keystring, iv);
let encrypted = cipher.update(text, inputEncoding, outputEncoding)
encrypted += cipher.final(outputEncoding);
return encrypted;
}
function decrypt(encrypted) {
let decipher = crypto.createDecipheriv(algorithm,keystring, iv)
let dec = decipher.update(encrypted, outputEncoding, inputEncoding)
dec += decipher.final(inputEncoding);
return dec;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |