2011-07-04 41 views
0

I'm Android平台和加密都非常新的共享密钥,所以大家多多包涵。我需要调用一个web服务,它需要我在调用之前加密一个参数。我收到的规范内容如下:加密了Android/Java平台

“我们使用AES加密设置为加密如下:

  • 重点:PublicKey12345678910

  • 位数:128

  • Padding:PKCS#7

  • 密码:密码块链接(CBC)“

现在,我的问题可能是缺少的加密过程的基本认识。我有我的公钥,但我该怎么处理它?我试图寻找答案在线,但我所有的努力似乎导致要么有错误的加密密钥或很经常的“InvalidKeyLengthException,关键不是128,196或256位”(或在大方向的东西)。我最近的努力,从一个答案,大量借鉴这里堆,看起来是这样的:

  String input = "TheParameterIWantToEncrypt"; 
     String secretID = "PublicKey12345678910"; 
     char[] inputChars = input.toCharArray(); 
     char[] pswChars = secretID.toCharArray(); 

     SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES", new BouncyCastleProvider()); 
     KeySpec spec = new PBEKeySpec(pswChars); 
     SecretKey tmp = factory.generateSecret(spec); 
     SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES"); 

     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
     cipher.init(Cipher.ENCRYPT_MODE, secret); 
     AlgorithmParameters params = cipher.getParameters(); 
     byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV(); 
     byte[] ciphertext = cipher.doFinal(input.getBytes()); 

     System.out.println(new String(ciphertext)); 

有人能以何种顺序做的事情在所提供的规范解释一下吗?此外,任何在Java/Android平台上实现这种行为的代码也将非常有用。

回答

1

忘记,片刻,实施细则,并让我们关注的事情在一个较高的水平。如果以这种方式执行加密,则您的私钥将以易于提取的方式存储在程序中的某处或程序所使用的数据中,从而危及加密。相比之下,如果您使用HTTPS(这是创建加密会话的非常标准的方式),那么将会有经过充分测试和充分研究的过程,从而使用非对称密码来建立随后使用的私钥创建加密通道(通常使用128位AES加密)。

你真的应该回推谁是为您提供此WebService提供过来的加密标准的HTTPS连接,而不是依靠加密这样的各个字段。

+0

嗯,这确实让很多的意义上,这似乎有点凌乱。但是,更换网络服务不是一种选择,所以我必须处理我所得到的。尽管非常感谢您的意见,但在将来讨论web服务时,我会牢记这一点。 – karl

+0

你不需要*替换它,但你需要修改它。但我并不认为这里有一个选择。你不可能在不损害它的情况下在客户端拥有私钥,而且如果你实现了自己的密钥交换,那么很容易出错。 –