Java中的AES-CBC-256解密

时间:2018-08-02 12:36:19

标签: java node.js encryption aes

我需要使用AES CBC 256在Java中加密一个值,但无法在NodeJS中对其解密:

使用以下代码生成密码字符串:

SecretKeySpec secretKey = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
String result = DatatypeConverter.printHexBinary(cipher.doFinal(test));

并以此解密:

var crypto = require('crypto');
var mykey = crypto.createDecipher('aes-256-cbc', key);
var mystr = mykey.update(value, 'hex', 'utf8')

但是代码返回错误:

Error: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt
    at Decipher.final (internal/crypto/cipher.js:104:26)
    at evalmachine.<anonymous>:12:16
    at Script.runInContext (vm.js:74:29)
    at Object.runInContext (vm.js:182:6)
    at evaluate (/run_dir/repl.js:133:14)
    at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
    at ReadStream.emit (events.js:180:13)
    at addChunk (_stream_readable.js:274:12)
    at readableAddChunk (_stream_readable.js:261:11)
    at ReadStream.Readable.push (_stream_readable.js:218:10)

我认为它与填充策略有关,但是我找不到关于NodeJS应用的任何文档。 Java Cypher中与NodeJS中cripto包提供的填充相对应的填充是什么?

1 个答案:

答案 0 :(得分:0)

CBC mode要求在第一块中进行加密时输入初始化向量(IV)。在 AES 的Java实现中,您可以在初始化密码时提供此功能,也可以让Java为您生成一个密码。在您的情况下,Java为您创建了一个 IV 。因为解密时需要这样做,所以您需要获取它并将其与加密的数据一起传递(这应该是随机的,但不必保密)。使用def read_image(self, image_path): path_length = string_length_tf(image_path)[0] file_extension = tf.substr(image_path, path_length - 3, 3) file_cond = tf.equal(file_extension, 'jpg') image = tf.cond(file_cond, lambda: tf.image.decode_jpeg(tf.read_file(image_path)), lambda: tf.image.decode_png(tf.read_file(image_path))) image = tf.image.convert_image_dtype(image, tf.float32) image = tf.image.resize_images(image, [self.params.height, self.params.width], tf.image.ResizeMethod.AREA) return image 方法来获取它。

NodeJS 中,有一个Cipher.getIV()的变体,您可以在其中提供名为<crypto.createDecipher()

IV