The text of this article is not in this database — only its details are. Read it on the old site: Encrypt in JavaScript and Decrypt in C# With AES Algorithm in ASP.Net in MVC 4
36 Comments
Join the conversation! Your thoughts help the community grow.
Sign in to leave a comment.

Pandurang RanePosted Dec 9, 2022, 12:07 PM
How can we encrypt string in C#
Jinesh PrajapatiPosted Sep 15, 2022, 7:17 AM
This project gives error while running
UdayPosted Mar 17, 2022, 12:36 PM
Hi, thanks for the wonderful article! In "DecryptStringAES" method, do we need last line "string.Format(decriptedFromJavascript);" ? It is throwing "Input string was not in a correct format" error when plainText value contains "{" or "}".
Santhosh NPosted Mar 16, 2022, 2:32 PM
Hello, Thank you so much for the blog. I really appreciate the effort.
Nilesh MondePosted Nov 26, 2021, 8:26 AM
;(function (root, factory, undef) { if (typeof exports === "object") { // CommonJS module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core")); } else if (typeof define === "function" && define.amd) { // AMD define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory); } else { // Global (browser) factory(root.CryptoJS); } }(this, function (CryptoJS) { (function () { // Shortcuts var C = CryptoJS; var C_lib = C.lib; var BlockCipher = C_lib.BlockCipher; var C_algo = C.algo; // Lookup tables var SBOX = []; var INV_SBOX = []; var SUB_MIX_0 = []; var SUB_MIX_1 = []; var SUB_MIX_2 = []; var SUB_MIX_3 = []; var INV_SUB_MIX_0 = []; var INV_SUB_MIX_1 = []; var INV_SUB_MIX_2 = []; var INV_SUB_MIX_3 = []; // Compute lookup tables (function () { // Compute double table var d = []; for (var i = 0; i < 256; i++) { if (i < 128) { d[i] = i << 1; } else { d[i] = (i << 1) ^ 0x11b; } } // Walk GF(2^8) var x = 0; var xi = 0; for (var i = 0; i < 256; i++) { // Compute sbox var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4); sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63; SBOX[x] = sx; INV_SBOX[sx] = x; // Compute multiplication var x2 = d[x]; var x4 = d[x2]; var x8 = d[x4]; // Compute sub bytes, mix columns tables var t = (d[sx] * 0x101) ^ (sx * 0x1010100); SUB_MIX_0[x] = (t << 24) | (t >>> 8); SUB_MIX_1[x] = (t << 16) | (t >>> 16); SUB_MIX_2[x] = (t << 8) | (t >>> 24); SUB_MIX_3[x] = t; // Compute inv sub bytes, inv mix columns tables var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100); INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8); INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16); INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24); INV_SUB_MIX_3[sx] = t; // Compute next counter if (!x) { x = xi = 1; } else { x = x2 ^ d[d[d[x8 ^ x2]]]; xi ^= d[d[xi]]; } } }()); // Precomputed Rcon lookup var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36]; /** * AES block cipher algorithm. */ var AES = C_algo.AES = BlockCipher.extend({ _doReset: function () { var t; // Skip reset of nRounds has been set before and key did not change if (this._nRounds && this._keyPriorReset === this._key) { return; } // Shortcuts var key = this._keyPriorReset = this._key; var keyWords = key.words; var keySize = key.sigBytes / 4; // Compute number of rounds var nRounds = this._nRounds = keySize + 6; // Compute number of key schedule rows var ksRows = (nRounds + 1) * 4; // Compute key schedule var keySchedule = this._keySchedule = []; for (var ksRow = 0; ksRow < ksRows; ksRow++) { if (ksRow < keySize) { keySchedule[ksRow] = keyWords[ksRow]; } else { t = keySchedule[ksRow - 1]; if (!(ksRow % keySize)) { // Rot word t = (t << 8) | (t >>> 24); // Sub word t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; // Mix Rcon t ^= RCON[(ksRow / keySize) | 0] << 24; } else if (keySize > 6 && ksRow % keySize == 4) { // Sub word t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff]; } keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t; } } // Compute inv key schedule var invKeySchedule = this._invKeySchedule = []; for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) { var ksRow = ksRows - invKsRow; if (invKsRow % 4) { var t = keySchedule[ksRow]; } else { var t = keySchedule[ksRow - 4]; } if (invKsRow < 4 || ksRow <= 4) { invKeySchedule[invKsRow] = t; } else { invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^ INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]]; } } }, encryptBlock: function (M, offset) { this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX); }, decryptBlock: function (M, offset) { // Swap 2nd and 4th rows var t = M[offset + 1]; M[offset + 1] = M[offset + 3]; M[offset + 3] = t; this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX); // Inv swap 2nd and 4th rows var t = M[offset + 1]; M[offset + 1] = M[offset + 3]; M[offset + 3] = t; }, _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) { // Shortcut var nRounds = this._nRounds; // Get input, add round key var s0 = M[offset] ^ keySchedule[0]; var s1 = M[offset + 1] ^ keySchedule[1]; var s2 = M[offset + 2] ^ keySchedule[2]; var s3 = M[offset + 3] ^ keySchedule[3]; // Key schedule row counter var ksRow = 4; // Rounds for (var round = 1; round < nRounds; round++) { // Shift rows, sub bytes, mix columns, add round key var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++]; var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++]; var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++]; var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++]; // Update state s0 = t0; s1 = t1; s2 = t2; s3 = t3; } // Shift rows, sub bytes, add round key var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++]; var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++]; var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++]; var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++]; // Set output M[offset] = t0; M[offset + 1] = t1; M[offset + 2] = t2; M[offset + 3] = t3; }, keySize: 256/32 }); /** * Shortcut functions to the cipher's object interface. * * @example * * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg); * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg); */ C.AES = BlockCipher._createHelper(AES); }()); return CryptoJS.AES; })); -- i am getting error at c.lib cannot read properties of undefined
abu arqamPosted Oct 13, 2021, 1:00 PM
Is there a way, we can generate dynamic key?
ArunPrasad RamasamyPosted Dec 25, 2020, 11:27 AM
Its working fine only after i added the crypto-js.js, if we are not added means error throw like 'cryptojs is not defined'. Thanks,
mahima maheshwariPosted Jul 6, 2020, 11:20 PM
Is there any way to hide the key? I can read the key from javascript and decrypt the password.
Deborah OpeyemiPosted Jun 5, 2020, 6:39 AM
Hello sir, the link to download the AES javascript is broken, how do I get it. thank
venkat tejaPosted May 22, 2020, 2:55 AM
Hi I'm getting undefined in plaintext.
Lucky LaxmanPosted Mar 3, 2020, 5:06 AM
Perfect solution for UI Encrypt and class level Decrypt.
santhi vanambhathinaPosted Jul 24, 2019, 1:48 AM
Hi Sir, while decrypting in api i am getting this error 'msDecrypt.ReadTimeout' threw an exception of type 'System.InvalidOperationException'
Niranjan SwainPosted Dec 7, 2018, 12:32 AM
Hi Sir, I have implement your code.when i use method name "DecryptStringAES" in c# each time getting "true" value but i am not getting proper value.Please help me.
Puneet KankarPosted Sep 10, 2018, 4:53 AM
Hi sir , In DecryptStringFromBytes method line number 41 using strat not proper.
SUNANDA RANAPosted Mar 14, 2018, 10:08 AM
Hi sir ....nice one..! I have implemented the above code and it successfully implemented also, but I want this encryption and decryption in .netcore environment can you please suggest me some idea or steps so that it can be easier for me
Tridip BhattacharjeePosted Feb 28, 2018, 3:34 AM
What is the below code....need some explanation to understand below two line's objective. what is this line for keySize: 128 / 8, var key = CryptoJS.enc.Utf8.parse('8080808080808080'); var iv = CryptoJS.enc.Utf8.parse('8080808080808080');
Tridip BhattacharjeePosted Feb 28, 2018, 3:33 AM
Sir please tell me why you choose AES algorithm...so many algo exist for encryption why AES ? any special reason.
Dan TruongPosted Dec 4, 2017, 4:23 AM
Is there any way to hide the key? I can read the key from javascript and decrypt the password
Haribabu ChimataPosted Nov 14, 2017, 5:07 AM
I am getting issue like: Invalid length for a Base-64 char array or string .. Please any one help on this
JyotiPosted Oct 7, 2017, 1:12 AM
I followed this article in my web application to encrypt the text using vs 2010 but same function when i am using in web api for decrypt the text which is encrypted in web application it gives me error 'msDecrypt.ReadTimeout error CS0103: The name 'msDecrypt' does not exist in the current context'. Thank you in advance
Ignacio ElfiPosted Jun 14, 2017, 10:55 AM
Perfect Article! Thank you Saineshwar!
chetna balaniPosted May 9, 2017, 5:53 AM
How can i decrypt the value(encrypted in js) in JS
Abraham ChavesPosted Nov 3, 2016, 1:28 PM
Hi, It's possible to get "keyError" as a result?
Deepak TiwariPosted Jan 13, 2016, 4:11 AM
When we are changing the value form "8080808080808080" to something else like "8684888184878784" in each side (client and server) it is throwing error. It seems it is fixed to this only.
Sai SherlekarPosted Oct 9, 2015, 6:54 AM
nice article, but i can read key from javascript and descrypt code
Yashwanth MuthineniPosted Aug 27, 2015, 3:17 AM
Nice Share
deepak mohantyPosted Aug 13, 2015, 9:02 AM
Hi,
S.Ravi KumarPosted Jun 2, 2015, 4:23 AM
Nice Article
Rahul Kumar SaxenaPosted Feb 28, 2015, 4:21 AM
Good Show...