ricmoo / aes-js

A pure JavaScript implementation of the AES block cipher and all common modes of operation for node.js or web browsers.
MIT License
1.45k stars 272 forks source link

Error: invalid plaintext size (must be multiple of 16 bytes) #89

Open shiqikai opened 5 years ago

shiqikai commented 5 years ago

aes-js version: 3.1.2. why should the length of plaintext in CBC be 16?

ricmoo commented 5 years ago

CBC Operates against blocks, so the data length must be a multiple of 16.

See the CBC section here: https://en.m.wikipedia.org/wiki/Block_cipher_mode_of_operation

Hope this helps. :)

fxqy commented 5 years ago

How to solve this problem, I also encountered this pit

fxqy commented 5 years ago

I don't know how to use it gracefully.Please help me write a better code. ------------------------------------------My code-------------------------------------------- function aesEcpt(text, pwd) { var shp = sha256_digest(pwd); var key = []; var iv = []; for (var i = 0; i < 32; i++) { var itm = shp.charCodeAt(i); if (i < 16) key.push(itm); else iv.push(itm); } var textBytes = aesjs.utils.utf8.toBytes(text); var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv); var encryptedBytes = aesCbc.encrypt(textBytes); var encryptedHex = aesjs.utils.hex.fromBytes(encryptedBytes); return encryptedHex; } function aesDcpt(text, pwd) { var shp = sha256_digest(pwd); var key = []; var iv = []; for (var i = 0; i < 32; i++) { var itm = shp.charCodeAt(i); if (i < 16) key.push(itm); else iv.push(itm); } var encryptedBytes = aesjs.utils.hex.toBytes(text); var aesCbc = new aesjs.ModeOfOperation.cbc(key, iv); var decryptedBytes = aesCbc.decrypt(encryptedBytes); var decryptedText = aesjs.utils.utf8.fromBytes(decryptedBytes); return decryptedText; }

zhbzhbzhbz commented 4 years ago

But when I'm using ECB mode, this error occurs too. And in Java, the bytes array is not limited to 16*N bytes.

RokerHRO commented 4 years ago

Perhaps Cipher Text Stealing should be implemented in CBC mode, to support arbitrary plaintext lengths:

https://en.wikipedia.org/wiki/Ciphertext_stealing

kishandonga commented 5 months ago

use the below functions, it will help in this issue

aesjs.padding.pkcs7.pad() aesjs.padding.pkcs7.strip()