亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號