1

暗号化されたメッセージ ダイジェストを解読したい。私は私のJavaプログラムにこのコードを持っています:

 String bobSignedMsg = SignedMsg;

    //At the receiving end, Bob extracts the msg 
    // length, the msg text, and the digital
    // signature from the signed msg.
    //Get the message length.
    int MsgLen = Integer.parseInt(bobSignedMsg.trim().substring(bobSignedMsg.length()-6));
    System.out.println(
               "\n12. Bob's calculated msg len: "
                                 + MsgLen);

    //Get the message text.
    String bobMsgText = bobSignedMsg.substring(
                                 0,MsgLen);
    System.out.println(
               "\n13. Bob's extracted msg text: "
                             + bobMsgText);

    //Bob knows that everything following the msg
    // text except for the four characters at the
    // end that indicate the message length is
    // the encoded and encrypted version of the
    // extended digital signature.  He extracts
    // it.
     String bobExtractedSignature =
          bobSignedMsg.substring(
            MsgLen,bobSignedMsg.length() - 6);
    System.out.println(
        "\n14. Bob's extracted extended digital "
                    + "signature: " 
                        + bobExtractedSignature);
    byte[] strtodecrypt=bobExtractedSignature.getBytes();

            byte[] decryptedCardNo = obj.rsaDecrypt(strtodecrypt,PbkeyPath);
         String decryptedform = obj.byteArrayToHexStr(decryptedCardNo);
         System.out.println("After Decryption: "+decryptedform);

上記のコード行で

byte[] decryptedCardNo = obj.rsaDecrypt(strtodecrypt,PbkeyPath);

関数を呼び出します:

public byte[] rsaDecrypt(byte[] sampleText,String pbkeypath) {
    PublicKey pubKey = null;
    try {
        pubKey = readKeyFromFile(pbkeypath);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Cipher cipher = null;
    try {
        cipher = Cipher.getInstance("RSA");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        cipher.init(Cipher.DECRYPT_MODE, pubKey);
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    byte[] cipherData = null;
    try {
        cipherData = cipher.doFinal(sampleText);
        // cipherData = cipher.
    } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (BadPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return cipherData;
}

しかし、次のエラーが発生します。

javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)

ブロックサイズの例外のエラーを解決する方法がわかりません.....誰かが私のプロジェクトで大きな助けになるアイデアを手伝ってくれるならお願いします.

4

1 に答える 1

0

RSA などのブロック暗号は、blockSizeバイトまでしか暗号化できません。同じキーで任意の大量のデータを暗号化する場合は、データをblockSizeの部分に分割し、各ブロックを個別に暗号化します。同じことが復号化にも当てはまります。

于 2012-09-09T17:26:08.727 に答える