RSA-Entschlüsselung Fehler - IllegalBlockSizeException: die Daten dürfen nicht länger als 128 Byte
Bin ich nun auf die Herstellung RSA message authentication software. Der Ablauf ist wie folgt:
- Unterschreiben Sie die Nachricht mit Einem privaten Schlüssel (1024 bit)
- Überprüfen Sie die Nachricht mit Einem öffentlichen Schlüssel (1024 bit)
Die #1 der code (unten) funktioniert einwandfrei und erzeugt Folgendes Ergebnis:
5554c9a9f6838b6cf40d9dbfbab3d90ea27aa6434ed095d289c13c2624617993ad99161ac265276d150510c176341d8ab8600d08b7353286d465e6bd3370a6fd8dd3ffb82916f612fd6dcee5e654ed801cfca6b6d2d5d6dc99ff7921b615abdf62eb67db1f71e6a6ea70012fd35e7cefa1a8d3aab7614c47746cfe1fc2bc875b
Aber die #2 code zeigt folgenden Fehler:
javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
Ich denke, die Zeile in #1 Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
erzeugt 2048 bits (256 Byte) Ergebnis. Vielleicht ist das das problem... erinnere mich, dass ich mit 1024 bit private Schlüssel.
Also, wie können Sie die #1 code generieren 128-byte-Ergebnis?
1. SignMail.java
public class SignMail {
static {
Security.addProvider(new org.spongycastle.jce.provider.BouncyCastleProvider());
}
public static String sign(String userOriginalMessage) throws Exception {
PEMReader userPrivateKey = new PEMReader(
new InputStreamReader(
new FileInputStream(Environment.getExternalStorageDirectory()+"/pkcs10priv.key")));
KeyPair keyPair = (KeyPair)userPrivateKey.readObject();
byte[] cipherText;
//modified by JEON 20130817
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//encrypt the message using private key
cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
cipherText = cipher.doFinal(userOriginalMessage.getBytes());
return new String(Hex.encode(cipherText));
}
}
2. UserSMSVerifier.java
public class UserSMSVerifier {
static String signedMail;
static {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
}
public static String messageGenarator(
String UserCert,
String origninalMessage
) throws Exception{
InputStream userCertStream = new ByteArrayInputStream(UserCert.getBytes("UTF-8"));
PEMReader userCerti = new PEMReader(
new InputStreamReader(
userCertStream));
//KeyPair userPrivate = (KeyPair)userPrivateKey.readObject();
X509Certificate userCert = (X509Certificate)userCerti.readObject();
byte[] dectyptedText = null;
//decrypt the text using the private key
//modified by JEON 20130817
//Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, userCert.getPublicKey());
dectyptedText = cipher.doFinal(origninalMessage.getBytes());
String result = new String(dectyptedText, Charset.forName("UTF-8"));
return result;
}
}
#2 code ausgeführt wurde, indem Sie den folgenden JSP -
#3 messageVeri.JSP
<%@ page language="java" contentType="text/html; charset=euc-kr" %>
<%@ page session = "true" %>
<%@ page import="java.sql.DriverManager" %>
<%@ page import="java.sql.Connection" %>
<%@ page import="java.sql.PreparedStatement" %>
<%@ page import="java.sql.Statement" %>
<%@ page import="java.sql.SQLException" %>
<%@ page import="java.sql.ResultSet" %>
<%@ page import="myPackage.UserSMSVerifier" %>
<%
request.setCharacterEncoding("euc-kr");
String userID = request.getParameter("sender");
String encryptedSMS = request.getParameter("encryptedSMS");
//String sql = "select user_id, user_pw from testca.testca_init where user_id=? and user_pw=?";
//String sql = "update testca.testca_init set pkcs10request = '"+pkcs10request_new+"' where user_id='user1'";
String sql = "select * from testca.testca_init where user_id='" + userID + "'";
Class.forName("com.mysql.jdbc.Driver");
Connection conn = null;
PreparedStatement pstmt = null;
Statement stmt = null;
ResultSet rs = null;
String jdbcDriver = "jdbc:mysql://localhost:3306/";
String dbUser = "root";
String dbPass = "fo.......t";
try{
conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
stmt = conn.createStatement();
//stmt.executeUpdate(sql);
rs=stmt.executeQuery(sql);
while(rs.next()){
//rs=stmt.executeQuery(sql);
String userCertificate=rs.getString("certificate");
UserSMSVerifier.messageGenarator(userCertificate, encryptedSMS);
}
}catch(Exception ex){out.print("Error 2: " +ex);}
/*
if(rs.next())
{
//session.setAttribute("userID", userID);
out.print("Insert Succeed!");
out.println();
//out.print("Welcome!" + " " + session.getAttribute("userID"));
}
else
{
out.print("failed to login!");
//session.invalidate();
}
*/
%>
siehe #3-codes (JSP).. die Fehler die durch das "try{}catch(Exception ex){out.print("Fehler 2:" +ex);}" Satz..
InformationsquelleAutor user1349407 | 2013-08-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Unterschrift string enthält 256 Zeichen, aber das ist hexadezimal und wirklich darstellt 128 bytes.
Bevor Sie die Signatur überprüfen, müssen Sie Sie konvertieren diese wieder in ein byte-array. Dies wird nicht erreicht durch
someString.getBytes()
sondern überDatatypeConvert.parseHexBinary(classextender)
(oder jede andere Methode, die Sie bevorzugen von Google).Außerdem würde ich Euch dringend raten, die
Signature
Klasse anstatt desCipher
Klasse beim signieren von Nachrichten. Derzeit kann der code nur Nachrichten verarbeiten, die kleiner sind als 128 Byte Länge (kleinere, in der Tat, wegen der Polsterung). Stattdessen sollten Sie das Hashen der Nachricht vor der Unterzeichnung (z.B. mit demSHA256withRSA
- Mechanismus).typo DatatypeConverter anstelle von DatatypeConvert. Speichern Sie eine minute für zukünftige Referenz
InformationsquelleAutor Duncan Jones
müssen Sie, teilen Sie Ihre Daten, indem Sie die publicKey -
InformationsquelleAutor Carl
Als Duncan sagte, Sie braucht so etwas wie DateTypeConverter.
Ich verwendet Base64.getDecoder().decode(encodedString), kehrte er 128 byte-array.
Wenn ich war mit encodedString.getBytes(), kehrte er 172 byte-array.
Übrigens hatte ich 1024 bit RSA-Schlüssel.
InformationsquelleAutor Vova Perebykivskyi
zuerst konvertieren von text zu Hex und dann verschlüsseln Sie es, nach verschlüsseln Sie können konvertieren von hex in string.
InformationsquelleAutor Ali Bagheri
Hier ist der code:
InformationsquelleAutor vipin kumar