Javastringencryption

我正在使用目标C中的encryption类为我的iPhone应用程序,但我努力从我的Android应用程序获得相同的function在JAVA工作。 我的encryption代码如下:

NSString * _secret = @"password"; NSString * _key = @"1428324560542678"; StringEncryption *crypto = [[StringEncryption alloc] init]; NSData *_secretData = [_secret dataUsingEncoding:NSUTF8StringEncoding]; CCOptions padding = kCCOptionPKCS7Padding; NSData *encryptedData = [crypto encrypt:_secretData key:[_key dataUsingEncoding:NSUTF8StringEncoding] padding:&padding]; 

我试图在JAVA中复制它,但是当我编码相同的数据时,我得到了一个不同的string。 所以我做错了,但我不明白。 这是我的JAVA代码:

 byte[] key = "1428324560542678".getBytes(); Cipher c = null; try { c = Cipher.getInstance("AES/ECB/PKCS7Padding"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } SecretKeySpec k = new SecretKeySpec(key, "AES"); try { c.init(Cipher.ENCRYPT_MODE, k); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { EditText tv1passwordText = (EditText) findViewById(R.id.password); String password = URLEncoder.encode(tv1passwordText.getText().toString(), "UTF-8"); byte[] encryptedData = c.doFinal( password.getBytes()); 

任何人都可以看到我要去哪里错了吗?

基于下面的评论,我添加了getBytes,但生成的string仍然不同:

 byte[] key = null; try { key = "1428324560542678".getBytes("UTF-8"); } catch (UnsupportedEncodingException e2) { // TODO Auto-generated catch block e2.printStackTrace(); } Cipher c = null; try { c = Cipher.getInstance("AES/ECB/PKCS7Padding"); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } SecretKeySpec k = new SecretKeySpec(key, "AES"); try { c.init(Cipher.ENCRYPT_MODE, k); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { EditText tv1passwordText = (EditText) findViewById(R.id.password); byte[] password = tv1passwordText.getText().toString().getBytes("UTF-8"); byte[] encryptedData = c.doFinal(password); 

这里是一个encryption和解密的例子:

 public static SecretKey generateKey() throws NoSuchAlgorithmException, InvalidKeySpecException { return secret = new SecretKeySpec(password.getBytes(), "AES"); } public static byte[] encryptMsg(String message, SecretKey secret) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidParameterSpecException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { /* Encrypt the message. */ Cipher cipher = null; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, secret); byte[] cipherText = cipher.doFinal(message.getBytes("UTF-8")); return cipherText; } public static String decryptMsg(byte[] cipherText, SecretKey secret) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidParameterSpecException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException { /* Decrypt the message, given derived encContentValues and initialization vector. */ Cipher cipher = null; cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, secret); String decryptString = new String(cipher.doFinal(cipherText), "UTF-8"); return decryptString; } 

要encryption:

  SecretKey secret = EncUtil.generateKey(); EncUtil.encryptMsg(<String to Encrypt>, secret)) 

解密

  EncUtil.decryptMsg(<byte[]>, secret)) 

如果可能的话,您应该使用CBC或CTR来代替使用ECB。 ECB是不安全的 。

它看起来像你的Objective-C代码使用UTF-8编码,但是你没有在你的Java代码中指定它。 使用getBytes("UTF-8")

有一件事我注意到过去曾经引起过一个问题,就是被encryption的iOSstring实际上是"Hello World\0" ,例如最后加了一个额外的空string。 所以尝试在Java中添加一个\0到你的string的末尾,看看它是否产生相同的结果。

此外,java上的URLEncoder步骤可能会引入额外的控制字符和iOS端不存在的其他内容。 将此后的文本与进入iOSencryption步骤的文本进行比较可能是值得的,以确保它们完全相同