RSA在Android上是不同的PC [英] RSA on Android is different from PC

查看:145
本文介绍了RSA在Android上是不同的PC的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我搜索了很多,但我没有找到有用的答案。我开发Java和Android的安全应用。我发现了一些问题,当我创建PC RSA密钥,我转RSA公钥到Android。当我在Android上使用公钥加密我的数据,我用在PC上的私钥解密数据,它显示Badpadding例外。我搜索关于该异常的谷歌。我发现,有同样的问题给我,但答案是没有用的一些用户。他们告诉我使用Base64编码为en code,但关键仍然是错误的。这里是我的code。

I search a lot but I didn't find the useful answer. I develop java and android security application. I found some problem that when I create RSA key on PC and I transfer RSA public key to android. When I encrypt my data with public key on android and I decrypt the data by using private key on PC, it shows Badpadding Exception. I search on the google on this exception. I found some user that has the same problem to me but the answer is no use. They told me to use Base64 to encode it but the key is still wrong. here is my code.

 public void generateKeys(){
    try {
        KeyPairGenerator generator;
        generator = KeyPairGenerator.getInstance("RSA");
        generator.initialize(1024, new SecureRandom());
        KeyPair pair = generator.generateKeyPair();

        pubKey = pair.getPublic();
        privKey = pair.getPrivate();
        //================================================
       System.out.println("My Public KEY "+pubKey.toString());
         System.out.println("My Private KEY "+privKey.toString());

        byte[]pk_byte = pubKey.getEncoded();
        byte[]sk_byte = privKey.getEncoded();

            FileOutputStream keyfos_pub = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"RSAKey/publicKey.txt"));
            keyfos_pub.write(pk_byte);
            keyfos_pub.close();

            FileOutputStream keyfos_pri = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"RSAKey/privateKey.txt"));
            keyfos_pri.write(sk_byte);
            keyfos_pri.close();
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 

}

当我打印出来的钥匙,它看起来像这样。

When I print out the key, it looks like this.

RSA Private CRT Key
            modulus: dba017a7653612c53f3a46bb99f5098c7bf9012d06f3d20f8f01a67d17aeefd83070a2ff181468679a2d5abae6f7c074b7b3888a4a57533acc3d2d1dfdd86cdc032d3eafd6cf8423edfa3451333bf1d7377352dd3feb9268032831abd72c5c932fed9b4c667f3da062f4beb7a321f2c434d232ee746885dce13a1656eb42fe6b
    public exponent: 10001
   private exponent: 72f10f5019653a5fa6de9e0432e80e4e4ad79fe8ebd99157793598e7a10c7a14000e0310548ee1b14efc6b9ea3a08845cd9a955c22da1f0207c000abd09d83228e05a42f9bd88733afc2a4c1e30770e7ac3c41c55adae734e4f8126da494a88f362d716d6b37a2d7bfbe53824cfb9dc7a0289aa432226bbece49129f47de2a61
             primeP: efa2665a1e08dce4450ad608e17df1e3650ab2cfc44e9b3b6a346611b270b245e21c28f71971d5062368e66b99297085f23104577e529ef08b263e63387cf17b
             primeQ: ea9fde740a15d7f68f5aadb72a588f65da3761119b0c73930f111a43d513d19f42185afcd0291f03a9861a7757108f0e83d4d904ddf541a2debd79344387bbd1
     primeExponentP: 45202ab84a3bb244a2e9fa4dfb861235cf5ae3b3ed63e381a32454613c8127dbe2daceb26103a638ac14418bbe55e6e0acb99910081f9b3bb65824dd08597a6b
     primeExponentQ: 53ca665a90a37e6e1a822ad9e8309a7da871f0a3a5f8cb69b08ece0f7d90476395ea36cc64d6dab1a72032617e6176859b852f3ff2b8bd091a7d164518fce791
     crtCoefficient: 695a3707d033aa2474a7a64959589842099a220540167b48f42bbbd1d786d1a84c378f9a1bc0311948287cbf7669aa44156dd9f24bfe88baf931e5da70a06c4

RSA Public Key
            modulus: dba017a7653612c53f3a46bb99f5098c7bf9012d06f3d20f8f01a67d17aeefd83070a2ff181468679a2d5abae6f7c074b7b3888a4a57533acc3d2d1dfdd86cdc032d3eafd6cf8423edfa3451333bf1d7377352dd3feb9268032831abd72c5c932fed9b4c667f3da062f4beb7a321f2c434d232ee746885dce13a1656eb42fe6b
    public exponent: 10001

我把我的钥匙到电脑,并打印出它看起来像这样

I send my key to PC and print out it looks like this

Sun RSA private CRT key, 1024 bits
  modulus:          133510687177139403090984227659818165988216147752229771757259279456909046924729578431711819486905574365970242930474912203422914618872480707080105400973005394104312017850522474151319747965391515392091886771183127658574637486403332621957057719375091145573274843838361168501101321026667287976397870949812555235301
  public exponent:  65537
  private exponent: 9980146428442039393666657480590341260299844482325612277626580558453963728645653672535456363067433797990268399780224833064816191126482490562360748269935354262219600344146818595176602910809143102802601846580823241077395526479491554799584457750285244532837191028964347562514222968145677820868899082320352227173
  prime p:          12299841631131712301068734715117232218530765196368758184959862403767638338760002562429845237522849739220962134079733702092483313582445665328865919334315231
  prime q:          10854667172235374767842313747899047475769598966944705527971116954964144369647441254504149073040778536441723902849901407264741891511747045046848533162966971
  prime exponent p: 9681923647204217071082501281466465900019303827612974308340469989251337818636053102684450861548877311242977166683023364260601327205871598989662862911311993
  prime exponent q: 1654443602597908945419791446477006656323336803344838236704510234877044083623118096514059921732827819407607611968318128037101282547428799502158627916518563
  crt coefficient:  8339065711012644104593134475846199184972354402766421557421676186133596071951423663692155855342215056476322973047333984032026031966395156454879551656339085

显然,密钥被更改,因为有1024比特显示在键和modulas数​​字是不相同的,以及

It is clear that the key was changed because there is a word "1024 bits" appear in the key and the number of modulas is not the same as well

我如何管理这个问题。我想专业人士来帮我请

How can I manage this problem. I'd like a professional to help me please

推荐答案

这看起来像一个不同的密钥。请再试一次,你可能已经发旧钥匙什么的。请确保你不重新生成密钥对,它每次都会有所不同。使用私钥打印出模量的BigInteger 代替; 的BigInteger 实例将始终打印出小数使一个便于比较。甚至更好,使用 BigInteger.toString(16)来得到一个十六进制再presentation。

That does look like a different key. Please try again as you've probably send an old key or something. Make sure you don't regenerate the key pair, it will be different each time. Use the private key to print out the modulus as BigInteger instead; BigInteger instances will always print out as decimals making for an easier comparison. Or even better, use BigInteger.toString(16) to get a hexadecimal representation.

如果你使用一个好的随机数发生器(如默认的Java中),那么模量应为密钥对唯一的。因此,或通过模量SHA1哈希通常用于确定关键

If you use a good random number generator (like the default one in Java) then the modulus should be unique for the key pair. Therefore it, or the SHA1 hash over the modulus is normally used to identify the key.

这篇关于RSA在Android上是不同的PC的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆