Расшифрованный результат RSA не соответствует подписанному сообщению

Я использовал API Bouncy Castle Crypto для расшифровки зашифрованного текста и проверки подписанного сообщения.

Подписанное сообщение:

signedMessageOther: D0F39F8C8495CA83D2F24536083CCB280CD3A54B

Сообщение расшифровано:

01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFF003021300906052B0E03021A05000414D0F39F8C8495CA83D2F2453608
3CCB280CD3A54B


Только последние 20 байт соответствуют signedMessageOther.
Почему?


Вот кое-что о ключе:

Algorithm: RSA
Format: X.509
Key Length: 162

Ключ имеет размер 162 байта -1024 bi, так что это допустимый ключ.
Вот код:

import java.security.PublicKey; 
import java.security.Security; 
import javax.crypto.Cipher; 

public class DecyrptTest { 
    public static void main (String[] args) throws Exception { 
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
        //msg is some secret msg ,i have deleted. 
        String msg = ""; 
        byte[] signedMsgBytes = SHA1.sign(msg); 
        String signedMessageOther=StringTools.bytesToHex(signedMsgBytes); 
        System.out.println("signedMessageOther: "+signedMessageOther); 

        String ct="1386cfed01490b9026903722324f80f8a56cc38169b46e15154ce9e7168ff589282855002e195a0c1a96d5fe540a7fa97b01ae24f365f39302e0c1186ee9308d6b94526741f7093dc2678c713bb2b1a8a6942decb35b16725353da523417cb835cea903485b19b63c2c444c8bc6c865ea78c749f10ca70b266f6078192f5c76c"; 

        Cipher cipher = Cipher.getInstance("RSA", "BC"); 
        PublicKey pubKey = KeyUtil.getPubKeyFromFile("res/key.pub"); 
        System.out.println("Algorithm: "+pubKey.getAlgorithm()); 
        System.out.println("Format: "+pubKey.getFormat()); 
        System.out.println("Key Length: "+pubKey.getEncoded().length); 

        cipher.init(Cipher.DECRYPT_MODE, pubKey); 
        byte[] ctBytes=StringTools.hexStringToByteArray(ct); 
        System.out.println(ctBytes.length); 
        byte[] cipherText2 = cipher.doFinal(ctBytes); 
        System.out.println("cipher: " + StringTools.bytesToHex(cipherText2)); 
    } 
}

person panyf07    schedule 12.11.2011    source источник


Ответы (1)


Вы пытаетесь доехать до работы с двигателем внутреннего сгорания. Вам нужна машина.

RSA — это примитивная операция, которую можно объединить с другими вещами, чтобы создать полезную систему шифрования. Вы не можете просто использовать его сам по себе, чтобы сделать всю работу.

Я не уверен, действительно ли это говорит о том, что ключ имеет длину 162 бита, но если это так, то это совершенно бесполезный размер ключа RSA. Ключ RSA должен быть не менее 384 бит, чтобы его вообще можно было использовать. Кроме того, RSA не может подписывать или шифровать данные, размер которых превышает размер ключа. 162 бита это примерно 20 байт. Звучит знакомо?

Вы не можете использовать двигатель, чтобы ездить на работу. Вам нужна машина. RSA - это двигатель.

person David Schwartz    schedule 12.11.2011
comment
На самом деле, у вас сейчас совсем другая проблема. Вы пытаетесь запустить электромобиль на бензине. Вам нужно использовать Signature, а не Cipher. Найдите цифровые подписи по этой ссылке. - person David Schwartz; 14.11.2011
comment
Я решил проблему с помощью Signatuer. Подпись sha1_rsa. Я также хочу знать о других шагах, которые были предприняты с Signatuer. - person panyf07; 16.11.2011