我的Android应用程序有一些问题.我正在尝试与RSA加密/解密相关的应用程序.这是我的问题:
我可以清楚地加密短句,但是当我尝试将此消息解密为原始文本时,我会给出错误("RSA块的数据太多").而且如果我想加密一个长句子我有同样的错误.我有一些搜索这个问题,并在这个网站找到了一些解决方案:
但我什么都不懂,这些解决方案都很复杂.我怎么能解决这个问题呢,有人能给我一个更简单的解决方案吗?谢谢.
EDİT:这些是我用于此项目的代码块.
public String RSAEncrypt(String plain) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException, UnsupportedEncodingException {
publicKey = getPublicKey();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherData = cipher.doFinal(plain.getBytes());
return Base64.encodeToString(cipherData, Base64.DEFAULT);
}
public String RSADecrypt(byte[] encryptedBytes) throws NoSuchAlgorithmException, NoSuchPaddingException,InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidKeySpecException, UnsupportedEncodingException {
privateKey = getPrivateKey();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] cipherData = cipher.doFinal(encryptedBytes);
return Base64.encodeToString(cipherData, Base64.DEFAULT);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用公钥/私钥加密和解密文本.首先,我创建了我的密钥并使用以下代码将它们存储在sharedpreferences中:
SharedPreferences SP;
SharedPreferences.Editor SPE;
KeyPairGenerator keyGen;
KeyPair keypair;
PublicKey publicKey;
PrivateKey privateKey;
keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(1024);
keypair = keyGen.genKeyPair();
privateKey = keypair.getPrivate();
publicKey = keypair.getPublic();
SPE = SP.edit();
SPE.putString("PublicKey", publicKey.toString());
SPE.putString("PrivateKey", privateKey.toString());
SPE.commit();
Run Code Online (Sandbox Code Playgroud)
在我的SharedPreferences文件中,键是这样写的:
PublicKey:RSA公钥
模量:d07b8f32968cf65301fd710f9d6d036feac01d7b98c92ff979cd324d252cb257ff48d6630b33f0f68bd0ee81c3a83502a0abf0b263dc96c2b86940f7ec19ab1865626383e55cf5a37e25ef4eb6ca88a39f31becb6065434bc2236177aa5b35266fe0379164faea6ef7a92812e7aa3ef5fc488c70ab085f5564f09c0f6e927b49
公众指数:10001
PrivateKey:RSA私人CRT密钥
模量:d07b8f32968cf65301fd710f9d6d036feac01d7b98c92ff979cd324d252cb257ff48d6630b33f0f68bd0ee81c3a83502a0abf0b263dc96c2b86940f7ec19ab1865626383e55cf5a37e25ef4eb6ca88a39f31becb6065434bc2236177aa5b35266fe0379164faea6ef7a92812e7aa3ef5fc488c70ab085f5564f09c0f6e927b49
公用指数:10001
私人指数:67ebef696c1a3fff0892e8f4bba8477a562e05844298a6cd58a5ac59401a939bc1a8f114d5d4c25c633d766640bd6c0f2f4005ef265022e6553e4220531448702e4bbf4322b9d5cf444d16eea151e5d565412b49208a73d9236607475d201affa21d374e3186f14b651b08565be4725f89fc6797a79c8433c4dd089589284a01primeP:ee4ad1a56f4ee3b12c198d09b08a92c349f94cc79a6143ca7140fa64c919f2d9c24c29d3b413fdc4039000b6b5feac5a764ce436db4a4a382d8ceecbc768e0d1
primeQ:dff9a761807440b4a5a4fb04ebaa22849f6543f33168bd6e83b3c549b346661124d7879e168c1009e97c01b3fdcd7088eebd9c989b64d7c4b81ea46f9e06d0f9
primeExponentP:2ce01e371f8d25c819dbfdf9932ba593ed7c6b7f338d99aca8436a644c92fc6f11ee31fa5271695adea8e1d986d09d38b40aaaf7c1b86dddc28645fa4e656be1
primeExponentQ:21904af9fc82ef5362e3474ea4763978005eef80d92da5fd92b4f4e2a77fec39b378acf50ed1ec715fd0da7c7b9336c2fe6be1b4a8ccc2dcd2ee9c9bb165ba19
crtCoefficient:d8ccccb874ec4c2d464e84829547507e1ebf78e506caa77950b04329957b8713e80553874b825bf5c90b214984b4657b64965867460d87aab135f43930db48ec
使用此代码我试图读取此键:
private PublicKey getPublicKey() throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeySpecException{
byte[] keyBytes = Base64.decodeBase64(SP.getString("PublicKey", "default value").getBytes("utf-8"));
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey key = keyFactory.generatePublic(spec);
return key;}
Run Code Online (Sandbox Code Playgroud)
但是出了点问题.它给出了InvalidKeySpecException.我无法从文件中读取密钥.我如何解决这个问题?谢谢.