0

暗号化に使用される C++ コードからの次のスニペットがあります。

EVP_CIPHER_CTX ctx;
const EVP_CIPHER * cipher = EVP_des_ede3_cbc();
unsigned char iv[EVP_MAX_IV_LENGTH];
unsigned char key[EVP_MAX_KEY_LENGTH];
String seed;

_config->get_value("crypto_seed", &seed); // uses the seed value from pimp config.

if (seed.is_empty())
{
    return false;
}

EVP_BytesToKey(cipher, EVP_sha1(),
        (unsigned char *) 0, // no salt
        reinterpret_cast<unsigned char *>(const_cast<char *>(seed.chars())), seed.length(),
        1, // hash passphrase just once.
        key, iv);

EVP_CIPHER_CTX_init(&ctx);
EVP_CipherInit_ex(&ctx, cipher, (ENGINE *) 0, key,
        iv,
        1); // encrypt

Java の C++ 暗号化に相当するものは何ですか?

desアルゴリズムがあることがわかりsha1ました。

これは、openssl 暗号化に関連しています。しかし、何が同等かはわかりません。基本的に、C++ コードが生成するものと同じ出力が必要です。

ここで使用されている暗号化の同等物EVP_CIPHER_CTXまたは名前を尋ねているので、そこから取得できます。

編集:コードをJavaに変換するように誰かに依頼するのではなく、対応するパッケージまたはクラスに同じことを依頼するだけです。

4

4 に答える 4

2

この中で最も難しい部分は、以前に再作成されたEVP_BytesToKey部分です。

AESを使用してopensslコマンドで暗号化されたJavaでファイルを復号化する方法は?

もしあなたが本当にそのCのようなコードを使うことに慣れていないのなら、私はこの辺りにオブジェクト指向バージョンも置いています。SHA-1の場合、MD5の代わりにSHA-1を使用します。

暗号化については"DESede/CBC/PKCS5Padding"、メソッドのアルゴリズム名として使用するだけCipher.getInstance()で問題ありません。

于 2012-10-16T21:38:34.077 に答える
0

EVP_CIPHER_CTX暗号化(オブジェクトに類似)を含む「コンテキスト」構造のように見えますが、実際に使用されている暗号は、友人EVP_des_ede3_cbcとの「des-ede3-cbc」にOpenSSL.encrypt(…)なります。

編集:質問(「対応するパッケージ」)に答えるには、通常、javax.cryptoまたは(おそらくほとんどの目的で「より良い」)bouncycastle(http://www.bouncycastle.org/)を使用する必要があります。ただし、OpenSSLバインディングも存在します。使用とデプロイが面倒です。

于 2012-10-16T18:08:28.310 に答える
0

変換元のコードは、openssl ライブラリを使用しています。初期ベクトルを使用してトリプル DES 暗号化を実行します。最初に理解する必要があるのは、それが何をしているのか (できればその理由) を正確に理解することです。

残念ながら、openssl のドキュメントはそれほど完全ではありません (こちらを参照)。ただし、O'Reilley の本Network Security with OpenSSLの方がかなり優れています (ただし、少し古くなっています)。

何をする必要があるかがわかれば、標準の javax.crypto パッケージを使用して Java でコーディングするのはそれほど難しくありません。

于 2012-10-16T18:22:25.103 に答える
0

使用されている暗号化は、暗号ブロック連鎖によるトリプル DESです。

RSA ページ:ソース

3DES EDE CBC 対称暗号を示す暗号識別子。

于 2012-10-16T18:07:35.840 に答える