0

メッセージに署名するための次のコードを作成し、Bouncy Castle の Java で検証します。

署名は正しく機能しますが、検証は完全には機能しません。短い入力メッセージでの検証は正しく機能しますが、大きな入力メッセージ (106 より大きい) では正しく機能しません。

つまり、サイン用の入力テキストが長くなると、ベリファイが完了できなくなります。コード出力の結果:

signature tampered

プライマリ メッセージの一部を返します。

public static String sigVer(PublicKey pu, PrivateKey pr, String original) throws Exception{
    //sign
    BigInteger big = ((RSAKey) pu).getModulus();
    byte[] text = original.getBytes();
    RSAKeyParameters rsaPriv = new RSAKeyParameters(true, big,((RSAPrivateKey) pr).getPrivateExponent());
    RSAKeyParameters rsaPublic = new RSAKeyParameters(false, big,((RSAPublicKey) pu).getPublicExponent());
    RSAEngine rsa = new RSAEngine();
    byte[] data;
    Digest dig = new SHA1Digest();
    ISO9796d2Signer eng = new ISO9796d2Signer(rsa, dig, true);
    eng.init(true, rsaPriv);
    eng.update(text[0]);
    eng.update(text, 1, text.length - 1);
    data = eng.generateSignature();

    //verify
    eng = new ISO9796d2Signer(rsa, dig, true);
    eng.init(false, rsaPublic);
    if (!eng.verifySignature(data)) {
        System.out.println("signature tampered");
    }
    try{
        if (eng.hasFullMessage()) {
            eng.updateWithRecoveredMessage(data);
            System.out.println("full");
        }
            eng.updateWithRecoveredMessage(data);
            byte[] message = eng.getRecoveredMessage();
            String ss = new String(message);
            return ss;
    }
    catch (Exception e) {
        System.out.println("can not recover");
        return null;
    }
}

関数が false を返す理由eng.hasFullMessage()と、この問題をどのように解決する必要がありますか? または、問題なく大きな入力を取得する別の解決策を提案できますか?

皆さんありがとう。

4

0 に答える 0