Memindahkan fungsi penyulitan AES ke node.js

PHPz
Lepaskan: 2024-02-12 13:57:13
ke hadapan
543 orang telah melayarinya

将 AES 加密功能移植到 node.js

Kandungan soalan

Saya cuba mengalihkan program go (https://github.com/mckael/samtv) ke node.js yang boleh mengawal TV Samsung melalui api "smartview"

Terdapat ciri "penyulitan aes" dalam program yang saya menghadapi masalah mengalihkan ke nod.

func (s *smartviewsession) aesencrypt(plaindata []byte) ([]byte, error) {
    //logrus.debugf("aesencrypt(%#v) : '%s'", plaindata, string(plaindata))
    //logrus.debugf("session id:  %d", s.sessionid)
    //logrus.debugf("session key: '%x'\n  %v", string(s.sessionkey), s.sessionkey)

    // create cipher block
    block, err := aes.newcipher(s.sessionkey)
    if err != nil {
        return nil, err
    }

    bs := block.blocksize()
    //logrus.debugf("block size: %d", bs)

    // add padding
    padding := bs - len(plaindata)%bs
    padtext := bytes.repeat([]byte{byte(padding)}, padding)
    //logrus.debugf("padding: %d byte(s)", padding)
    plaindata = append(plaindata, padtext...)

    // encrypt
    ciphertext := make([]byte, len(plaindata))
    for cipherrange := ciphertext; len(plaindata) > 0; {
        block.encrypt(cipherrange, plaindata[:bs])
        plaindata = plaindata[bs:]
        cipherrange = cipherrange[bs:]
    }

    //logrus.debugf("ciphertext: %#v", ciphertext)
    return ciphertext, nil
}
Salin selepas log masuk

Masalah yang saya hadapi sekarang ialah saya tidak tahu algoritma apa yang hendak digunakan atau di mana saya perlu nyatakan dalam fungsi node.js saya yang "vektor awal" berasal:

const SESSION_KEY = "59e8ca4b09f2a19ab5421cf55d604c7c";

var aesEncrypt = ((val, algo = "aes-256-cbc") => {
    let cipher = crypto.createCipheriv(algo, SESSION_KEY, IV);
    let encrypted = cipher.update(val, 'utf8', 'base64');
    encrypted += cipher.final('base64');
    return encrypted;
});
Salin selepas log masuk

Bolehkah saya menggunakan crypto.createcipher(...) sebagai ganti? Tetapi ia telah ditamatkan, dan rasanya seperti bahan padding itu penting.

Saya tidak tahu apa-apa tentang penyulitan. Sebarang petua dialu-alukan.

Nota: Dalam fungsi go, nilai s.sessionkey adalah sama dengan nilai session_key = "59e8ca4b09f2a19ab5421cf55d604c7c" dalam node.jss.sessionkey与node.js中的session_key = "59e8ca4b09f2a19ab5421cf55d604c7c"的值相同

解决方法

go 代码在 ecb 模式下应用 aes 并使用 pkcs#7 填充。 aes 变体隐式源自密钥大小,例如aes-128 用于 16 字节密钥。密文返回为 []byte

Solution

aes-128-ecb。 ecb模式不应用iv,因此必须在createcipheriv()中指定为null。使用填充 pkcs#7(默认)。密文可以返回为 buffer,它最接近 []byteSolution

kod dalam mod ecb Gunakan aes dan gunakan padding pkcs#7. Varian aes adalah implisit yang diperoleh daripada saiz kunci, cth. Teks sifir dikembalikan sebagai []bait.

59e8ca4b09f2a19ab5421cf55d604c7c 看起来像一个十六进制编码的密钥,它是十六进制解码的 16 字节大,因此对应于 aes-128。十六进制解码可以在 go 中使用 encoding/hex 包来实现,例如与 hex.decodestring("59e8ca4b09f2a19ab5421cf55d604c7c")Dalam kod nodejs, varian dan mod aes dinyatakan secara eksplisit, seperti

.

Kunci Terbitan

.

Contoh kod Nodejs menggunakan aes-128 (kunci 16 bait) dan padding pkcs#7 dalam mod ecb: key := []byte("59e8ca4b09f2a19ab5421cf55d604c7c")const session_key = buffer.from("59e8ca4b09f2a19ab5421cf55d604c7c", "utf-8") nodejs 代码。在 nodejs 代码中,还必须应用 aes-256-ecb

var crypto = require('crypto');

const SESSION_KEY = Buffer.from("59e8ca4b09f2a19ab5421cf55d604c7c", "hex");

var aesEncrypt = ((val, algo = "aes-128-ecb") => {
    let cipher = crypto.createCipheriv(algo, SESSION_KEY, null);
    return Buffer.concat([cipher.update(val, 'utf8'), cipher.final()]);
});

var ciphertext = aesEncrypt("The quick brown fox jumps over the lazy dog");
console.log(ciphertext.toString('base64')); // T/uQforseVFkY93mqwpwCGVVnEFDTT5Gle8a8XUxCfOXCfYUo3uCJ/nwzCIJ9xqf
Salin selepas log masuk
Kod go memberikan hasil yang sama menggunakan kunci yang sama (penyahkodan hex) dan pengekodan base64 teks biasa dan teks sifir.

Untuk kesempurnaan: kunci juga boleh dikodkan utf-8 dan kemudian menjana kunci 32 bait, seperti 🎜 dalam kod go. Akhirnya, spesifikasi utama mesti menyediakan maklumat tentang pengekodan yang hendak digunakan. 🎜 🎜Sila ambil perhatian bahawa mod ecb tidak selamat. Pada masa kini adalah perkara biasa untuk menggunakan penyulitan yang disahkan, contohnya melalui mod gcm. 🎜

Atas ialah kandungan terperinci Memindahkan fungsi penyulitan AES ke node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!