Tag: encryption

PHP和Node.js的encryption结果不同

我使用AES 128 CBC以空白iv和键(16 0)对string“aaaaaaaaaaaaaaaaaa”(一个16字节的UTF8string)进行encryption,得到不同的结果 在PHP中: echo base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128,pack("H*", "00000000000000000000000000000000"),"aaaaaaaaaaaaaaaa",MCRYPT_MODE_CBC,pack("H*", "00000000000000000000000000000000"))) 返回“kmwP6gWv1l9ZMdKanGs / nA ==” 在Node.js中: let cipher = require('crypto').createCipheriv('aes-128-cbc',Buffer.alloc(16),Buffer.alloc(16)) console.log(cipher.update('aaaaaaaaaaaaaaaa','utf8','base64') + cipher.final('base64')) 返回“ kmwP6gWv1l9ZMdKanGs / n HeUidae8Z4dK0HU7p2z + 1c =” 第一位(粗体)与PHP相同,但PHP值有一个额外的'A =',然后Node值有一个额外的'HeUidae8Z4dK0HU7p2z + 1c' 我承认我在这里发生了什么事情 – 我在这里错过了什么? 编辑 …但不是那么不稳定,我不明白,我在这里做什么是不是特别安全。 不要担心这是否是“正确的”encryption方式,请注意结果应该一致。 edit2 – 然而,我可以使用hex而不是base64closures – PHP:926c0fea05afd65f5931d29a9c6b3f9c 节点: 926c0fea05afd65f5931d29a9c6b3f9c 779489d69ef19e1d2b41d4ee9db3fb57 第二个节点hex块是由.final方法返回的,我不明白它是什么。

Node.js Crypto AES密码

出于某种奇怪的原因,Node的内置Cipher和Decipher类没有按预期工作。 该文档指出cipher.update “返回encryption的内容,并且在stream式传输时可以使用新数据多次调用。” 该文件还声明cipher.final “返回任何剩余的encryption内容。” 但是,在我的testing中,您必须调用cipher.final来获取所有数据,从而使Cipher对象变得毫无价值,并且要处理下一个块,您必须创build一个新的Cipher对象。 var secret = crypto.randomBytes(16) , source = crypto.randomBytes(8) , cipher = crypto.createCipher("aes128", secret) , decipher = crypto.createDecipher("aes128", secret); var step = cipher.update(source); var end = decipher.update(step); assert.strictEqual(source.toString('binary'), end); // should not fail, but does 请注意,这发生在使用crypto.createCipher或crypto.createCipheriv ,秘密作为初始化向量。 解决办法是用下列内容replace第6行和第7行: var step = cipher.update(source) + cipher.final(); var end = decipher.update(step) + decipher.final(); […]

Node.js aes128encryption/解密端口到PHP

所以在node.js我有一个encryptionscheme使用aes128而不通过IV。 一个例子如下 var cipher = require('crypto').createCipher('aes128','password'); cipher.update('test','utf8','base64')+cipher.final('base64'); 输出CjZ3R/tW8jiyLvg+/TE6bA== 。 问题是,我不能在PHP中重现这一点,即使我已经尝试了一堆实现和变化。 当我然后尝试通过openssl运行这个,我运行以下: echo "test" | openssl enc -e -aes128 -a -k password 输出U2FsdGVkX19Ccfv3SWvuzuZWeov9GDuwx1RMK2HWa / s =也不匹配。 我也尝试使用-md和所有可能的选项,并且两者都不匹配(它们甚至不是相同的块大小)。 在PHP中运行时,我尝试过使用填充(padding)对填充字符进行散列操作(填充字符是所需填充字符的数目)(在网上看到这是nodejs使用的内容)。 我已经尝试将IV设置为密码,也尝试将空字节,但我仍然无法获得匹配。 任何build议/想法? 编辑: 所以我刚刚在php中发现了函数openssl_encrypt,并尝试了相同的testing,并再次得到了一个完全不同的输出(现在这个输出与node.js完全相同,据说它们都使用openssl): openssl_encrypt ( "test" , 'aes128' , "password") 哪些输出(已经在base64中) JleA91MvYHdEdnj3KYHmog==这是至less现在在块计数匹配,但仍然不是相同的密文。 我还应该提到的是,将IV传递给nodejs是一种select,可以解决这个差异,但是这个phpscheme将取代已经存在的nodejs中的旧scheme,所以它必须能够解密已经创build的密文

PHP和Javascript之间是否有共同的encryption方法?

我想用PHPencryption我的用户ID,将它们发送到JavaScript。 并在JavaScript解密他们。 有不同的语言之间的encryption和解密有任何常见的方法吗? 我正在使用节点js。 nodejs有服务器端的JavaScript。 实际上它是服务器端解密。 但它是JavaScript。

Node.js Crypto类使用更新的版本返回不同的结果

下面的代码为一个单一loginbutton生成HTML输出,并将其添加到页面中。 在节点版本0.5.x中,服务器在button单击时接受密钥,但在升级到0.10.x后,密钥不起作用并产生不同的输出。 没有错误。 encryption类是否改变了? 请注意,密钥,url和iv已被稍微更改,以避免发布安全信息,但长度正确。 var util = require('util'); var crypto = require('crypto'); var fs = require('fs'); var dateFormat = require('dateformat'); var AESCrypt = {}; AESCrypt.encrypt = function(cryptkey, iv, cleardata) { var encipher = crypto.createCipheriv('aes-256-cbc', cryptkey, iv), encryptdata = encipher.update(cleardata); encryptdata += encipher.final('binary'); encode_encryptdata = new Buffer(encryptdata, 'binary').toString('hex'); return encode_encryptdata; } function getKey(email){ var now […]

这是一个密码安全的方法来生成一个随机数在节点JS?

这是我用我自己的Cryptography.random()replaceMath.random()的尝试。 我的代码是否会生成一个密码安全的随机数,您是否看到有优化的机会? NodeCrypto = require('crypto'); Cryptography = function() { } Cryptography.random = Promise.method(function() { return new Promise(function(resolve, reject) { NodeCrypto.randomBytes(4, function(ex, buffer) { var hex = buffer.toString('hex'); var integer = parseInt(hex, 16); var random = Number('0.'+integer); resolve(random); return random; }); }); });

生成iv时出现crypto.createDecipheriv错误

我使用crypto.createDecipheriv有一个非常奇怪的错误 在定义下面的代码时: var decipher = crypto.createDecipheriv('aes-256-cbc', '3dc837d877144001c1291fdda417903d9130aeac', '1234567890123456'); 和请求到达这一行我马上得到一个错误,崩溃我的应用程序: Error: Invalid key length at Error (native) at new Decipheriv (crypto.js:282:16) at Object.Decipheriv (crypto.js:279:12) 有没有人知道这可能是什么原因造成的? 谢谢。

一个语言或库中创build的jwt能否被解码和validation?

所以我有一个使用golang和jwt-go库来发布jwt的API服务器,我想要一个使用node.js和jsonwebtoken库运行的socket.io服务器,需要解码和validation令牌,所以我的问题是我从一个库发出一个令牌,从另一个库解码和validation它?

crypto#randomBytes是如何随机的?

crypto.randomBytes(20).toString('hex') ? 容易,所有我需要知道。

用CryptoJS解密openssl AES

我试图使用CryptoJS 3.1.5解密用opensslencryption的文件。 一切工作正常,如果我使用CryptoJSencryption和解密,壳在OpenSSL一样,但是当我尝试混合CryptoJS与OpenSSL一切都出错了。 该文件是使用以下命令创build的: openssl enc -aes-256-cbc -in file.txt -out file.enc -k password 我试图解密这样的: fs.readFile('file.enc', function(err, data) { var decrypted = CryptoJS.AES.decrypt( data.toString(), "password", { mode : CryptoJS.mode.CBC } ); console.log(decrypted.toString(CryptoJS.enc.Utf8)); }); // Give me this err: Uncaught Error: Malformed UTF-8 data 而另一方面,我也这样做: fs.readFile('file.txt', function(err, data) { var encrypted = CryptoJS.AES.encrypt( data.toString(), "password", { mode […]