Ich versuche, ein Go-Programm (https://github.com/mckael/samtv) auf node.js zu portieren, das einen Samsung-Fernseher über die „Smartview“-API steuern kann
Es gibt eine „AES-Verschlüsselung“-Funktion im Programm, die ich nicht auf den Knoten portieren kann.
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 }
Das Problem, mit dem ich jetzt konfrontiert bin, ist, dass ich nicht weiß, welchen Algorithmus ich verwenden soll oder wo ich in meiner node.js-Funktion angeben muss, woher der „Anfangsvektor“ kommt:
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; });
Kann ich stattdessen crypto.createcipher(...)
verwenden? Aber es ist veraltet und es scheint, dass die Polsterung wichtig ist.
Ich weiß nichts über Verschlüsselung. Jeder Tipp ist willkommen.
Hinweis: In der Go-Funktion ist der Wert von s.sessionkey
derselbe wie der Wert von session_key = "59e8ca4b09f2a19ab5421cf55d604c7c"
in node.jss.sessionkey
与node.js中的session_key = "59e8ca4b09f2a19ab5421cf55d604c7c"
的值相同
go 代码在 ecb 模式下应用 aes 并使用 pkcs#7 填充。 aes 变体隐式源自密钥大小,例如aes-128 用于 16 字节密钥。密文返回为 []byte
aes-128-ecb
。 ecb模式不应用iv,因此必须在createcipheriv()
中指定为null
。使用填充 pkcs#7(默认)。密文可以返回为 buffer
,它最接近 []byte
go Code im EZB-Modus. Wenden Sie aes an und verwenden Sie pkcs#7-Padding. Die AES-Variante ist implizit und leitet sich von der Schlüsselgröße ab, z. B. aes-128 für 16-Byte-Schlüssel. Der Chiffretext wird als []byte
zurückgegeben.
Im NodeJS-Code werden AES-Varianten und -Modi explizit angegeben, z. B. 59e8ca4b09f2a19ab5421cf55d604c7c
看起来像一个十六进制编码的密钥,它是十六进制解码的 16 字节大,因此对应于 aes-128。十六进制解码可以在 go 中使用 encoding/hex 包来实现,例如与 hex.decodestring("59e8ca4b09f2a19ab5421cf55d604c7c")
.
Veröffentlichter Schlüssel
.Nodejs-Codebeispiel mit aes-128 (16-Byte-Schlüssel) und pkcs#7-Padding im Ecb-Modus:
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
key := []byte("59e8ca4b09f2a19ab5421cf55d604c7c")
和 const session_key = buffer.from("59e8ca4b09f2a19ab5421cf55d604c7c", "utf-8")
nodejs 代码。在 nodejs 代码中,还必须应用 aes-256-ecb
Der Go-Code liefert das gleiche Ergebnis mit demselben Schlüssel (Hex-Dekodierung) und Base64-Kodierung von Klartext und Chiffretext.
Der Vollständigkeit halber: Der Schlüssel kann auch utf-8-codiert werden und dann einen 32-Byte-Schlüssel generieren, wie
im Go-Code. Letztendlich muss die Schlüsselspezifikation Aufschluss darüber geben, welche Kodierung verwendet werden soll. 🎜 🎜Bitte beachten Sie, dass der EZB-Modus nicht sicher ist. Heutzutage ist es üblich, eine authentifizierte Verschlüsselung zu verwenden, beispielsweise über den GCM-Modus. 🎜Das obige ist der detaillierte Inhalt vonPortierung der AES-Verschlüsselungsfunktionalität auf node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!