Articles of rsa

ArrayIndexOutOfBoundsException:RSA块的数据太多

我的Android应用程序有一些问题。 我正在尝试与RSA加密/解密相关的应用程序。这是我的问题: 我可以清楚地加密短句,但是当我尝试将此消息解密为原始文本时,我会给出错误(“RSA块的数据过多”)。 而且如果我想加密一个长句子我有同样的错误。我有一些搜索这个问题,并在这个网站find了一些解决方案: 网站1 网站2 网站3 但我什么都不懂,这些解决方案都很复杂。我怎么能解决这个问题,有人能给我一个更简单的解决方案吗? 谢谢。 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 […]

获取错误java.lang.ArrayIndexOutOfBoundsException:RSA块的数据太多

我有私人pem密钥文件,我使用该文件进行签名和加密数据。 签名工作正常,我也能够在另一个平台上validation,但在加密数据时,我得到以下错误: 04-04 09:55:51.821: E/AndroidRuntime(2725): FATAL EXCEPTION: Thread-102 04-04 09:55:51.821: E/AndroidRuntime(2725): java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block 04-04 09:55:51.821: E/AndroidRuntime(2725): at com.android.org.bouncycastle.jce.provider.JCERSACipher.engineDoFinal(JCERSACipher.java:457) 04-04 09:55:51.821: E/AndroidRuntime(2725): at javax.crypto.Cipher.doFinal(Cipher.java:1106) 04-04 09:55:51.821: E/AndroidRuntime(2725): at com.example.testsigning.MainActivity.rsaEncrypt(MainActivity.java:185) 04-04 09:55:51.821: E/AndroidRuntime(2725): at com.example.testsigning.MainActivity$1.run(MainActivity.java:51) 04-04 09:55:51.821: E/AndroidRuntime(2725): at java.lang.Thread.run(Thread.java:856) 以下是从私有文件中提取密钥的代码段: // Read the file into string String privKeyPEM = readFile(“/mnt/sdcard/rsa_key”); privKeyPEM […]

在Android中实现RSA Publickey

我已经使用php,javascript和android app使用库实现了RSA加密: php侧的phpseclib pidcrypt for javascript bouncrycastle版本(bcprov-jdk14-151)用于anrdroid serviceprovider 我有我的加密机制,如: user->request->publickey ->server->generate(publickey,privatekey) and save private key into Database ->server->sendpublickey->user ->user->encryptdata->send->server->decrypt 但是这种机制在javascript和php加密和解密之间工作正常但在android平台上服务器发送公钥时。 它无法解密公钥。 现在我已经为此测试了不同的场景 PHP KeyGenerating $rsa = new Crypt_RSA(); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1); define(‘CRYPT_RSA_EXPONENT’, 65537); extract($rsa->createKey(1024)); PHP DecryptingCode $rsa = new Crypt_RSA(); $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); $rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1); $rsa->loadKey($pri); $binaryCiphertext=base64_decode($encrypted); $strBase64DecryptedData=$rsa->decrypt($binaryCiphertext); $plaintText = base64_decode($strBase64DecryptedData); 因为我的公钥是。 —–BEGIN RSA PUBLIC KEY—– MIGJAoGBALrBdN8F83hT2+pBsAwiNx+v3FWp51IdEElE8UvVhfZYmePbitpzLcJi jZ4/tvRFXJGhqa3PKPUQkH2F4VrHruA2kNceiL/Btywc9oM+tDMeX1jcRKwXwK1k […]

如何在Android上存储密码

我希望了解Android密钥库,以便在设备上存储密码。 ( https://developer.android.com/training/articles/keystore.html ) 在本文中,它说“使用Android密钥库提供商让个人应用程序存储自己的凭据,只有应用程序本身才能访问。” 这正是我想要的。 所以我认为这将起作用的方式如下:1)我将生成一个RSA密钥 2)将PrivateKey存储在KeyStore中 3)将PublicKey存储在某些SharePref中 4)使用PublicKey加密密码 5)使用PrivateKey加密密码。 但是我觉得我误解了一些东西,因为这篇文章没有显示出来 1)如何将PrivateKey保存到KeyStore(我没有看到任何API显示keystore如何添加密钥) 2)没有说明如何使用PrivateKey解密数据 婴儿为什么这篇文章谈论“在KeyStore中使用PrivateKey来创建一些数据的签名”。 在某些数据上创建签名是什么意思? (我想用PrivateKey解密数据)。 为什么要validation“以前由PrivateKey制作的签名”。 所以我在这一点上迷失了…这篇文章让我在正确的地方开始,但最后我很困惑它想要实现的目标。 有人可以建议我试图做什么根本没有任何意义吗? 或者我应该只在我自己的数据库中保存公钥和私钥? (那里的安全性不是很高,但考虑到在设备上存储密码的要求,我能做到最好)。 非常感谢 Rgds !!!!

Java RSA中String的键

我在我的应用程序中使用RSA加密。 要存储生成的公钥,我将其转换为String,然后将其保存在数据库中。 Key publicKey=null; Key privateKey=null; KeyPair keyPair=RsaCrypto.getKeyPairRSA(1024); publicKey=keyPair.getPublic(); privateKey=keyPair.getPrivate(); String publicK=Base64.encodeToString(publicKey.getEncoded(), Base64.DEFAULT); String privateK=Base64.encodeToString(privateKey.getEncoded(), Base64.DEFAULT); 我保存字符串publicK和privateK 。 我的问题是,当我想用​​RSA加密/解密文本并使用我保存的Key in String格式时,我不知道如何将其转换为Key 。 public static String encrypt(Key publicKey, String inputText){ byte[]encodedBytes=null; String encryptedText=””; try { Cipher cipher=Cipher.getInstance(“RSA”); cipher.init(Cipher.ENCRYPT_MODE, publicKey); encodedBytes=cipher.doFinal(inputText.getBytes()); } catch (Exception e) {Log.e(“Error”, “RSA encryption error”); } encryptedText=Base64.encodeToString(encodedBytes, Base64.DEFAULT); return encryptedText; } 你有什么主意吗? 非常感谢

Java:如何从字符串生成PrivateKey?

我正在尝试使用SH1 RSA对消息进行编码,但除了一些有关RSA基本信息之外,我没有安全主题的经验。 我被赋予了一个私钥作为String 。 我已经成功编写了以下代码块来完成这项工作,但我不确定我是否正确地安全地完成了这项工作。 我不是专家,但在代码中将我的私钥作为字符串放置是不安全的我猜。 谁能指导我? String privateKeyString = “mykeyhere…”; byte[] privateKeyBytes = privateKeyString.getBytes(); String encodedPrivateKey = Base64.encodeToString(privateKeyBytes, Base64.URL_SAFE); KeyFactory factory = KeyFactory.getInstance(RSA); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey.getBytes()); RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(keySpec); Signature instance = Signature.getInstance(ALGORITHM); instance.initSign(privateKey); instance.update(content.getBytes()); return new String(instance.sign()); 我的私钥forms如下: “—–BEGIN PRIVATE KEY—–\n”+ “MIIE…\n”+ “cH0iRj…\n”+ “O0Hhj…\n”+ . . . “fG6…\n”+ “B6/hF…\n”+ […]

从文件加载公钥数据

在我的应用程序中,我生成一个公钥/私钥对并存储它们以供以后在磁盘上使用。 加载和重新初始化私钥工作正常,但对于私钥,我得到一个未知的KeySpectypes:java.security.spec.PKCS8EncodedKeySpec – 我不知道为什么。 这就是我创建和保存密钥的方式(代码有点简化以便于阅读): KeyPairGenerator kpg = KeyPairGenerator.getInstance(“RSA”); kpg.initialize(4096); KeyPair keyPair = kpg.generateKeyPair(); privKey =keyPair.getPrivate(); pubKey =keyPair.getPublic(); DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PRIVKEY_FILE,Context.MODE_PRIVATE)); byte[] data=privKey.getEncoded(); out.write(data); out.close(); DataOutputStream out=new DataOutputStream(ctx.openFileOutput(PUBKEY_FILE,Context.MODE_PRIVATE)); byte[] data=pubKey.getEncoded(); out.write(data); out.close(); 下一次加载私钥工作正常: DataInputStream in=new DataInputStream(ctx.openFileInput(PRIVKEY_FILE)); byte[] data=new byte[in.available()]; in.readFully(data); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(data); KeyFactory kf = KeyFactory.getInstance(“RSA”); privKey = kf.generatePrivate(keySpec); decryptCipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); […]

大数据未使用RSA加密进行加密

我的问题: 我的加密代码适用于64个以下的字符 。 但如果它超过64个字符我得到以下错误 javax.crypto.IllegalBlockSizeException: input must be under 64 bytes 加密代码 cipher = Cipher.getInstance(“RSA/ECB/PKCS1Padding); cipher.init(Cipher.ENCRYPT_MODE, publicKey); encryptedBytes = cipher.doFinal(message.getBytes(StandardCharsets.UTF_8)); rsaEncrypted= Base64.encodeToString(encryptedBytes, Base64.NO_WRAP); 密钥生成代码 KeyPairGenerator keyGen = KeyPairGenerator.getInstance(“RSA”); keyGen.initialize(512); KeyPair keypair = keyGen.genKeyPair(); PublicKey pub = keypair.getPublic(); byte[] pubs = pub.getEncoded(); 我的问题: 有可能用512位密钥加密大文本吗? 我的代码中有任何错误吗? 注意:如果有人想要完整的代码,我会稍后更新。

从APK确定签名证书

我已经从Eclipse为Android创建了一个签名的APK。 我想知道在签名的APK中使用哪种RSA证书types,如RSA-1024或RSA 2048。 我怎么知道来自APK文件? 编辑标题已更改为“在Eclipse中使用哪个RSA证书签名APK?如何知道RSA密钥大小(1024/2048)?”

带有RSA签名的SHA256在各种Android设备上返回不同的输出

我正在开发一个Android应用程序,我需要使用java Signature类进行数据身份validation。 在每台Android设备上,我都可以对数据进行签名并validation其签名。 但是,给定一定数量的数据进行签名,一个明确的模数,一个确定的私有指数和一个明确的公共指数,我的签名输出是不同的,具体取决于设备。 我尝试使用大量设备,我获得了Android 3.2和3.2.1的相同签名,但是对于Android 2.2.x设备却有所不同。 我从以前在java项目中使用带有RSA的KeyFactory生成的常量字段计算这些签名。 密钥大小为2048bit。 以下是我用于调用签名和validation的代码的引用。 public byte[] signData(byte[] data, PrivateKey privateKey) throws … { Signature signature = Signature.getInstance(“SHA256withRSA”); signature.initSign(privateKey); signature.update(data); return signature.sign(); } public boolean verifyData(byte[] data, byte[] sigBytes, PublicKey publicKey) throws … { Signature signature = Signature.getInstance(“SHA256withRSA”); signature.initVerify(publicKey); signature.update(data); return signature.verify(sigBytes); } 如果我没有误解,使用带RSA的SHA256的签名是确定性的。 那怎么能解释这样的行为呢? 另一个有趣的问题是,我如何才能使这项工作跨设备,即签名是相同的,不管我使用哪种设备? 先谢谢你,弗兰克!