0

EVP_aes_256_cbc暗号化されたレガシーデータとRSA 公開鍵を復号化する Go スクリプトを作成しています。

C では、これは次のようになります。

key_size = EVP_OpenInit(&ctx, EVP_aes_256_cbc(), evp_key, eklen, iv, pkey);
//...
EVP_OpenUpdate(&ctx, destination, &len_out, buffer_in, buffer_size)
//...
EVP_OpenFinal(&ctx, destination+len_out, &len_out);

Go にはevp_keyとのivバイト配列に相当するものがありますが、OpenSSL で EVP がどのように機能するかはわかりません (私は C の能力がかなりありますが、この復号化が行われるプロセスを把握することはできません)。 OpenSSL ソースを参照してください。)

Go では、ここまで到達できます。

pKey := //rsa.PrivateKey
eklen := 32
evpKey := "// hidden 32 byte array"
iv := "// hidden 16 byte array"

c, err := aes.NewCipher(iv)
cbc := cipher.NewCBCDecrypter(c, iv)

そして、ここで私は迷子になります。と がありevpKeyますpKeyが、ここからデータを復号化する方法がわかりません。OpenSSL はRSA_decrypt_oldそのようなものを使用していますが、それが実際に何を意味するのかを追跡することはできません。

Go に相当するものはありますか? それとも、あまりにも高価なcgoパッケージを破棄して袖をまくる必要がありますか?

更新 (解決):

Go で EVP の動作を再現しようとしている人、または EVP が正確にどのように機能するのか疑問に思っている人のために、以下に内訳を示します。C(またはJavaまたはその他のOpenSSL実装)が次のような暗号化を行っていることがわかっている場合:

// pseudo-code: don't copypasta and expect amazing
EVP_PKEY_assign_RSA(pkey, public_key);
EVP_CIPHER_CTX_init(&ctx);
EVP_SealInit(&ctx, EVP_aes_256_cbc(), &evp_key, &evp_key_len, iv, &pkey, 1);
EVP_SealUpdate(&ctx, buffer_out, &encrypt_len, (unsigned char*)buffer_in, len);
EVP_SealFinal(&ctx, buffer_out+encrypt_len, &encrypt_len);

「シール」は、実際には RSA 公開鍵で鍵を暗号化するだけです。

Go でそのようなものを復号化するには:

evpKeyBytes := "// the rsa.PublicKey encoded evpKey"
evpKey, err := rsa.DecryptPKCS1v15(rand.Reader, PrivateKeyRSA, evpKeyBytes)
c, err := aes.NewCipher(evpKey)
cbc := cipher.NewCBCDecrypter(c, iv)
decryptedDataBytes := make([]bytes, 2048) // some message size
cbc.CryptBlocks(decryptedDataBytes, encryptedDataBytes)
data = string(decryptedDataBytes)
// data should have the expected decrypted result.
4

1 に答える 1

2

NewCipherivではなくキーを想定しており、128ビットのivを渡しているため、aes128cbcとして機能します。

于 2014-09-03T23:53:19.177 に答える