Ich benutze RSA verschlüsseln Text und Text entschlüsseln. Der öffentliche Schlüssel und der private Schlüssel werden mit dem OpenSSL-Tool generiert. Ich habe eine "java.lang.ArrayIndexOutOfBoundsException: zu viele Daten für RSA Block" Ausnahme beim Entschlüsseln von Daten festgestellt.java.lang.ArrayIndexOutOfBoundsException: zu viele Daten für RSA-Block
ist die RSA util Klasse:
package studio.uphie.app;
import android.util.Base64;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
* Created by Uphie on 2016/4/11.
*/
public class RSA {
private static String RSA = "RSA";
/**
*
* @param text text to be encrypted
* @param pub_key rsa public key
* @return encrypted data in byte-array form
*/
public static byte[] encryptData(String text, String pub_key) {
try {
byte[] data = text.getBytes();
PublicKey publicKey = getPublicKey(Base64.decode(pub_key.getBytes(), Base64.DEFAULT));
Cipher cipher = Cipher.getInstance(RSA);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(data);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
*
* @param text text to be decrypted
* @param pri_key rsa private key
* @return
*/
public static byte[] decryptData(String text, String pri_key) {
try {
byte[] data = text.getBytes();
PrivateKey privateKey = getPrivateKey(Base64.decode(pri_key.getBytes(),Base64.DEFAULT));
Cipher cipher = Cipher.getInstance(RSA);
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
} catch (Exception e) {
//"java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block" exception occurs here.
return null;
}
}
/**
*
* @param keyBytes
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
public static PublicKey getPublicKey(byte[] keyBytes) throws NoSuchAlgorithmException, InvalidKeySpecException {
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
return keyFactory.generatePublic(keySpec);
}
/**
*
* @param keyBytes
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeySpecException
*/
public static PrivateKey getPrivateKey(byte[] keyBytes) throws NoSuchAlgorithmException,
InvalidKeySpecException {
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(RSA);
return keyFactory.generatePrivate(keySpec);
}
}
Und das Snippet, das und entschlüsselt Daten verschlüsselt:
//encrypt
byte[] e = RSA.encryptData(text, PUBLIC_KEY);
String result = Base64.encodeToString(e, Base64.DEFAULT);
tv_encrypted.setText(result);
//decrypt
byte[] d = RSA.decryptData(text, PRIVATE_KEY);
String result = Base64.encodeToString(d, Base64.DEFAULT);
tv_decrypted.setText("Decrypted result:\n" + result);
ich der Grund, dass der Text zu lang entschlüsselt werden kann ist, aber ich verschlüssele einfach "abc" und entschlüssele dann das verschlüsselte "abc". Und wie geht man mit der Verschlüsselung von Langtext um, wenn der zu verschlüsselnde oder entschlüsselte Text um 11 Bytes kleiner sein sollte als der private Schlüssel rsa? Wie kann ich tun, um es zu lösen? Ich bin neu in RSA.
Vielen Dank im Voraus!
Danke für deine Hilfe! Vielleicht habe ich viel von dieser Frage. Openssl erzeugt unlesbare Byte-Sequenzen: public key und private key und konvertiert sie in base64-kodierten Text, der lesbar ist. Beim Verschlüsseln oder Entschlüsseln benötigt die Chiffre den Bytecode des Textes und des Schlüssels. Ich nahm Ihren Rat und änderte meine RSA-Util-Klasse und es funktioniert gut. – Uphie