为了账号安全,请及时绑定邮箱和手机立即绑定

AES-128 点击率的输出与高浪和节点 J 具有不同的输出

AES-128 点击率的输出与高浪和节点 J 具有不同的输出

Go
繁星coding 2022-09-26 17:26:38
无法弄清楚PHP openssl_encrypt是如何工作的,也无法在GoLang和NodeJs中重现其输出,以下是PHP中的简化代码 - 输出:hvAB<?php$string = 'aaa';$cipher = "AES-128-CTR";$options = 0;$encryption_iv = '1234567890123456';$encryption_key = 'bc7316929fe1545bf0b98d114ee3ecb8';$encryption = openssl_encrypt($string, $cipher, $encryption_key, $options, $encryption_iv);echo $encryption; // hvAB在GoLang中,假设密钥必须进行十六进制解码才能获得所需的长度16,以便使用AES 128 - 输出:PQ5kpackage mainimport (    "crypto/aes"    "crypto/cipher"    "encoding/base64"    "encoding/hex"    "fmt")func main() {    plainText := "aaa"    fmt.Println(encryption(plainText)) // PQ5k}func encryption(plainText string) string {    bytes := []byte(plainText)    blockCipher := createCipher()    stream := cipher.NewCTR(blockCipher, []byte("1234567890123456"))    stream.XORKeyStream(bytes, bytes)    return base64.StdEncoding.EncodeToString(bytes)}func createCipher() cipher.Block {    key, _ := hex.DecodeString("bc7316929fe1545bf0b98d114ee3ecb8")    block, err := aes.NewCipher(key)    if err != nil {        panic(err)    }    return block}在节点Js中 - 输出:PQ5kvar crypto = require('crypto');var algorithm = 'aes-128-ctr';function encrypt(text, password) {  const key = Buffer.from(password, "hex").slice(0, 16);  const ivBuffer = Buffer.from("1234567890123456");  const cipher = crypto.createCipheriv(algorithm, key, ivBuffer);  let encrypted = cipher.update(text,'utf8','base64') +  cipher.final('base64')  console.log(encrypted) // PQ5k}encrypt('aaa', 'bc7316929fe1545bf0b98d114ee3ecb8');起初认为这是一个编码问题,但我认为这是正确的 - 将返回base64值。我需要将PHP变体翻译成GoLang,但是(几乎)任何其他语言的示例将不胜感激。openssl_encrypt
查看完整描述

2 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

在PHP代码中,密钥不是十六进制解码的,而是一个大小为32字节的二进制字符串,因此对于AES-128来说太大了。

PHP/OpenSSL 通过仅考虑前 16 个字节来隐式截断密钥。

在 Go 中,只需使用key := []byte("bc7316929fe1545b")

在节点JS中:获取 PHP 结果。const key = Buffer.from("bc7316929fe1545b", "utf8")

相反,在 PHP 代码中,密钥也可以使用 进行十六进制解码。hex2bin()


查看完整回答
反对 回复 2022-09-26
?
跃然一笑

TA贡献1826条经验 获得超6个赞

这里的 c/c++ 版本,但输出与 golang/nodejs 还不一样。



       #include <openssl/aes.h>

       #include <stdio.h>

       #include <string.h>

    

       int main() {

        AES_KEY aes_key;

        unsigned char key[AES_BLOCK_SIZE] = {0xbc, 0x73, 0x16, 0x92, 0x9f, 0xe1, 0x54, 0x5b, 0xf0, 0xb9, 0x8d, 0x11, 0x4e, 0xe3, 0xec, 0xb8 }; 

        unsigned char iv[AES_BLOCK_SIZE]  = {1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6}; 

        unsigned char ecount[AES_BLOCK_SIZE]; memset( ecount, 0, 16 );

        unsigned int num = 0 ; 

        const  char *x = "aaa";        

        unsigned char out[16];         

        AES_set_encrypt_key(key, 128, &aes_key); 

        AES_ctr128_encrypt( (const unsigned char *) x, out, AES_BLOCK_SIZE, &aes_key, iv, ecount, &num);

        for (int k = 0; k < 3; k++)  printf("%02x", out[k]); // c9aa18

        printf( "\n");

        return 0;

       }

       // g++ -o aes-simple aes-simple.cpp  -I/usr/local/ssl/include  -L/usr/local/ssl/lib -g    -lcrypto 


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 70 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信