4

BouncyCastle API を使用して、楕円曲線 Diffie Hellman 暗号化を実装しました。しかし、鍵協定が正しく機能していないようです。それは偽を印刷します。

私はどこで間違ったのですか?ありがとうございました。

ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("B-571");

    KeyPairGenerator g = KeyPairGenerator.getInstance("ECDH", "BC");

    g.initialize(ecSpec, new SecureRandom());

    KeyPair aKeyPair = g.generateKeyPair();

    KeyAgreement aKeyAgree = KeyAgreement.getInstance("ECDH", "BC");

    aKeyAgree.init(aKeyPair.getPrivate());

     KeyPair bKeyPair = g.generateKeyPair();

    KeyAgreement bKeyAgree = KeyAgreement.getInstance("ECDH", "BC");

    bKeyAgree.init(bKeyPair.getPrivate());

    //
    // agreement
    //
    aKeyAgree.doPhase(bKeyPair.getPublic(), true);
    bKeyAgree.doPhase(aKeyPair.getPublic(), true);

    byte[] aSecret = aKeyAgree.generateSecret();
    byte[] bSecret = bKeyAgree.generateSecret();

    System.out.println(aSecret);
    System.out.println(bSecret);
    if (aSecret.equals(bSecret)){
        return true;
    } else { return false; }
4

1 に答える 1

9

Bouncy Castle 1.49 でテストしたところ、正しく動作しました。ただし、間違った方法で比較しています。

バイト配列の内容を出力するには、次を使用しますArrays.toString

System.out.println(Arrays.toString(aSecret));
System.out.println(Arrays.toString(bSecret));
return MessageDigest.isEqual(aSecret, bSecret);

編集:OPは、「時定数比較」の意味を説明するように私に求めたので、ここに行きます:時定数比較は、2つの文字列が一致するかどうかに関係なく、実行に同じ時間がかかります。通常、非時定数比較は、2 つの文字列に不一致がある場合に実行にかかる時間が短く、実行時間は不一致の場所によって異なります。最初の不一致が検出されると、比較は停止します。

時定数の比較が必要かどうかは、タイミングオラクルがあるかどうかによって異なります。つまり、比較にかかった時間の長さから、攻撃者は有益な情報を得ることができるでしょうか?

タイミング オラクルの例を次に示します。ブラウザに Cookie を送信する Web サーバーであるとします。ユーザーが Cookie を改ざんしたくないので、Cookie のコンテンツの HMAC を添付します。

cookie_to_send = hmac(cookie) + ":" + cookie

ここで、ブラウザーが Cookie を送り返してきたら、HMAC を再計算して一致するかどうかを確認します。

mac, cookie = received_cookie.split(":")
compare(mac, hmac(cookie))

比較が失敗した場合 ( が とmac一致しない場合hmac(cookie))、要求を拒否します。

上記のcompare操作では、これが一定時間の比較であることが非常に重要です。それ以外の場合、攻撃者はサーバーがリクエストを拒否するのにかかった時間を調べ、それを使用して予想される HMAC 値を推測できます。これは、比較の 1 つのコンポーネント (最初の:.


あなたの場合、(比較している) バイト配列は から生成されます。generateSecret()これは、攻撃者によって制御されていないことを示唆しています。したがって、表面的には、時定数の比較が必要であるかのようには見えません。しかし、私はセキュリティの専門家ではないので、確かなことはわかりません。時定数比較を使用することは常に安全です(ただし、比較される文字列が長い場合は遅くなる可能性があります)。

于 2013-08-20T05:00:10.653 に答える