I am trying to convert below C# code to angular 9 using CryptoJS because when I tried to convert C# code to angular, it gives different encrypted string.
How to convert C# code using Rfc2898DeriveBytes into angular 9 using CryptoJS?
C# code:
public static string Encrypt(string clearText)
{
clearText = '123456';
let EncryptionKey:any = "secret key string";
let clearBytes :any= Encoding.Unicode.GetBytes(clearText);
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
}
clearText = Convert.ToBase64String(ms.ToArray());
}
}
return clearText;
}
Angular 9 code:
import * as CryptoJS from 'crypto-js';
encryptionKey: any = 'secret key string';
let encryptedStr = CryptoJS.AES.encrypt('123456', this.encryptionKey.trim()).toString();
Can anyone please help me to get the same encryption like C# using angular 9 ?
Alright, I know it's probably frowned upon on Stackoverflow as
it is not a code-writing service
but I found this challenge to be a good sport, so here goes:JSFiddle: https://jsfiddle.net/nhupdk6q/1/
Here's the corresponding code I used in .Net fiddle (sadly that does not allow to 'save' without logging in), I used the .Net Core 3.1 runtime with
System.Security.Cryptography.Algorithms
nuget package.Both listings print the same string.
The biggest challenge, as mentioned in the comments, was that since your .Net code re-uses the same PBKDF2 instance, each
.GetBytes()
call is essentially the nextcb
of the password. (cb is parameter name in .net code https://learn.microsoft.com/en-us/dotnet/api/system.security.cryptography.rfc2898derivebytes.getbytes?view=netcore-3.1#System_Security_Cryptography_Rfc2898DeriveBytes_GetBytes_System_Int32_)The PBKDF2 in CryptoJS does not have this so we need to call it once and get both Key and Iv and then do the parsing ourselves.