Articles of rsa

在Android M和旧版本中使用KeyStore加密和解密用户名?

我正在尝试使用KeyStore在应用程序中加密和解密用户名, 使用KeyPairGeneratorSpec在旧版本中创建密钥,如18到22, KeyPairGeneratorSpec已经在Android M的第23版中进行了描述,但是Android M支持KeyGenParameterSpec。 此KeyGenParameterSpec是否支持向后兼容性或我如何执行此操作? 我尝试了这样的事情,有没有更好的解决方案。 现在工作正常! 在加密和解密的Ciper.getInstance时我需要这样做。 是否有任何单个参数“RSA / ECB / OAEPWithSHA-256AndMGF1Padding”或“RSA / ECB / PKCS1Padding”我可以同时传递这两个版本 ? if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ c = Cipher.getInstance(“RSA/ECB/OAEPWithSHA-256AndMGF1Padding”); }else{ c = Cipher.getInstance(“RSA/ECB/PKCS1Padding”); } 下面的代码现在运行正常,请告诉我如何改进它。 密钥生成器: genkey(){ KeyPairGenerator generator = KeyPairGenerator .getInstance(KeyProperties.KEY_ALGORITHM_RSA, “AndroidKeyStore”); if(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){ TCLog.e(TAG,”Current version is 23(MashMello)”); //Api level 23 KeyGenParameterSpec spec = new KeyGenParameterSpec.Builder( keyName, […]

RSA加密:Java和Android之间的区别

我使用RSA加密Android上的用户名和密码,并在服务器上解密它们(tomcat 6,java 1.6)。 Android加密: PublicKey pubKey = readPublicKeyFromFile(mod, ex); Cipher cipher = Cipher.getInstance(“RSA”); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] cipherData = cipher.doFinal(data); return cipherData; Java Tomcat解密: PrivateKey pubKey = readPrivateKeyFromFile(mod, ex); Cipher cipher = Cipher.getInstance(“RSA”); cipher.init(Cipher.DECRYPT_MODE, pubKey); byte[] cipherData = cipher.doFinal(data); return cipherData; 如果我使用android部分OUTSIDE android(只是在主方法)它工作正常。 但不在我的android(模拟器)里面。 在服务器端,我收到以下错误: javax.crypto.BadPaddingException: Blocktype mismatch: 0 at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311) at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255) at com.sun.crypto.provider.RSACipher.a(DashoA13*..) at […]

PKCS1-padding / RSA加密ios objc和java之间的区别

我正在为ios和Android开发应用程序。 我对加密任务比较陌生,在过去的3天里,我不停地撞墙,因为我无法运行RSA加密。 两个客户端都从Java服务器接收公钥。 在android我有(显然,因为它几乎与服务器端的代码相同)没有麻烦,但ios部分似乎根本不兼容。 我想用公钥加密一小段数据(aes密钥),这就是我在Java中的做法: try { String publickey = “MCwwDQYJKoZIhvcNAQEBBQADGwAwGAIRAK+dBpbOKw+1VKMWoFxjU6UCAwEAAQ==”; byte[] bArr = Crypto.base64Decode(publicKey, false); KeyFactory keyFactory = KeyFactory.getInstance(“RSA”, “BC”); EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKey); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); Cipher cipher = Cipher.getInstance(“RSA/NONE/PKCS1Padding”, “BC”); cipher.init(1,publicKey); int cipherBlockSize = cipher.getBlockSize(); ByteArrayOutputStream bArrOut = new ByteArrayOutputStream(); bArrOut.flush(); int pos = 0; Log.i(“ContentBufferLength”, contentBuffer.length+””); while (true) { […]

用较less的内存来encryption/解密大文件的最佳做法

我想开发一个Android应用程序,用RSA和一些对称encryptionalgorithm来encryption和解密大文件(〜500Mb)。 我怎样才能做到这一点? 只有几MB内存的设备上使用什么是最好的解决scheme? 问候鲍比

从APK中确定签名证书

我已经从Eclipse for Android创build了一个签名的APK。 我想知道哪个RSA证书types在像RSA-1024或RSA 2048那样签名的APK中使用。 我怎么知道从APK文件? 编辑标题从“在Eclipse中签名APK使用哪个RSA证书?如何知道RSA密钥大小(1024/2048)?”

从文件加载公钥数据

在我的应用程序中,我生成一个公钥/私钥对,并将其存储起来,以便以后在磁盘上使用。 加载和重新初始化私钥工作正常,但对于私钥我得到一个未知的KeySpectypes:java.security.spec.PKCS8EncodedKeySpec – 我不知道为什么。 这就是我创build和保存密钥的方法(代码有点简化,以便于阅读): 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签名的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); } 如果我没有错,使用SHA256和RSA的签名是确定性的。 那我该如何解释这种行为呢? 另一个有趣的问题是,我怎样才能使这项工作跨设备,即签名将是相同的,没有哪一个设备,我用? 先谢谢你,弗兰克!

如何创build一个无限有效的Android密钥库RSA密钥?

以下是Googlebuild议创buildAndroid密钥库的方法 : keytool -genkey -v -keystore my-release-key.keystore -alias alias_name \ -keyalg RSA -keysize 2048 -validity 10000 虽然10000天可能看起来像永恒,但27年可能会比你想象的更快,RSA可能还在使用中。 如果调整一个命令行参数现在有将来有0.01%的机会来节省我的市场份额,我愿意这样做。 问题:如何尽可能地延长这个有效期?

如何在Android中使用C#生成的RSA公钥?

我想确保Android应用程序和C#ASP.NET服务器之间的消息隐私,在HTTPS不能被假定为可用的情况下。 我想使用RSA来encryption从Android设备传输的对称密钥,当它首次联系服务器时。 RSA密钥对已在服务器上生成,并且私钥保存在服务器上。 密钥对是在C#中使用以下命令生成的: // Create a new instance of RSACryptoServiceProvider RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(2048); // Ensure that the key doesn't get persisted rsa.PersistKeyInCsp = false; RSAParameters parameters = rsa.ExportParameters(false); string modulus = Convert.ToBase64String(parameters.Modulus); string exponent = Convert.ToBase64String(parameters.Exponent); string xmlKeys = rsa.ToXmlString(true); 尝试通过硬编码embedded公钥(从Visual Studio复制到Eclipse)不起作用。 该代码将引发org.bouncycastle.crypto.DataLengthException:对rsaCipher.doFinal()方法调用中的RSA密码input过大。 // Generate a new AES key byte[] key = […]

在Android中使用base64编码的公钥对RSA进行encryption

如何使用base-64编码的公钥对字节数组进行RSAencryption? 在阅读了一些关于如何在Java中进行RSAencryption的文章(谷歌search)之后,find了下面的代码片断 public byte[] rsaEncrypt(byte[] data) { PublicKey pubKey = readKeyFromFile("/public.key"); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); byte[] cipherData = cipher.doFinal(src); return cipherData; } 我有公钥作为base64编码的string(126个字符),我如何使用编码的string创build'PublicKey',并使用密码。