当前位置: 首页 > 知识库问答 >
问题:

java.lang.ArrayIndexOutOfBoundsException:RSA块的数据太多

韦辰钊
2023-03-14
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);
    }
}
 //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);

共有1个答案

秦天宇
2023-03-14

您的代码中缺少了一些步骤,因此无法进行检查。然而,有几条线索暗示了一个问题。您的DecryptData方法接受一个字符串参数,然后调用String.GetBytes()来获取数据,然后对其进行解密。然而,加密的结果是一个字节序列,它不是任何有效字符串的编码。也许您的意思是base64解码输入,而不是调用getBytes()。通常,要执行解密和解码,必须将加密和编码期间执行的步骤反转。因此,如果明文是字节[],则步骤如下:

byte[]加密byte[]Base64编码字符串。

然后,在解密方向,从Base64字符串开始,必须:

 类似资料:
  • 问题内容: 我打开kibana并进行搜索,但出现碎片失败的错误。我查看了elasticsearch.log文件,然后看到此错误: 有什么办法可以增加593.9mb的限制? 问题答案: 您可以尝试在配置文件中将fielddata断路器的限制提高到75%(默认值为60%),然后重新启动集群: 或者,如果您不想重启群集,则可以使用以下方法动态更改设置: 试试看。

  • 我使用的mysql2库与NodeJS。我在本地机器和服务器上有相同的代码和数据库结构。当我上传一张照片到“照片”表时,在我的本地机器上,它工作正常。当我使用服务器时,我得到以下错误: {错误:数据太长,列'照片'在第1行Packet.as错误(/srv/project/server/node_modules/mysql2/lib/数据包/packet.js:716: 13)在查询。Command.

  • 我是区块链新手。突然我得到一个问题,我们是否可以通过区块号从以太坊区块链访问以前的区块数据。 例如,我创建了一个block1,block2。 block1有数据“apple”,之后我将数据更改为“banana”,因此创建了新的block 2。我知道如果我们调用get data函数,那么它将给出输出香蕉,但是如果我想通过块号as 1访问block1中的数据,如何访问它? 有任何方法可以访问以前块的数

  • 问题内容: 我的Android应用程序存在一些问题。我正在尝试与RSA加密/解密相关的应用程序。这是我的问题: 我可以清楚地加密短句,但是当我尝试将此消息解密为原始文本时,我给出一个错误(“ RSA块数据太多”)。另外,如果我想加密一个长句子,我也会遇到同样的错误。 但是我什么都不懂,这些解决方案太复杂了。我该如何解决这个问题,谁能给我一个更简单的解决方案?谢谢。 EDİT:这些是我用于该项目的代

  • 我已经编写了一个MySQL脚本,为假设的医院记录创建一个数据库,并用数据填充它。其中一个表Department有一个名为Description的列,该列声明为varchar(200)类型。对Description I执行INSERT命令时,出现错误: 错误1406:数据对于第1行的列“描述”来说太长。 我插入的所有字符串都小于150个字符。 以下是声明:< br > 下面是插入命令: 显然,这应该

  • 我使用MediaCodec对相机数据进行编码,当我在一个名为Vivo X5 Pro(android 5.0,API 21)的设备上使用时,MediaCodec编码的数据大小在90000以上,在其他设备上通常是15000左右,但是我改变了媒体格式的参数,也不起作用。在Vivo X5 Pro(android 5.0,API 21)上用MediaCodec.getOutputFormat()方法得到的格