【问题标题】:How to encrypt in Java and decrypt in Android and iOS如何在 Java 中加密并在 Android 和 iOS 中解密
【发布时间】:2013-12-30 03:29:46
【问题描述】:

我有一个 Linux 服务器运行一个 Java-jar 文件,该文件对多个文件进行加密。

Android 和 iPhone 应用程序下载该文件并将其解密。我必须使用什么算法来做到这一点?

我认识到我在 Java 中使用的算法在 Android 中不起作用。我在 Java 中所做的是:

private static byte[] encrypt(byte[] raw, byte[] clear) throws Exception {
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
    byte[] encrypted = cipher.doFinal(clear);
    return encrypted;
}

上面的代码有什么问题? 有其他选择吗?

【问题讨论】:

  • “什么不起作用”不仅在文本上不正确,而且也是一个可怕的描述。 try 在客户端做了什么?你是如何传输密文的?

标签: java android ios iphone encryption


【解决方案1】:

iOS:

我使用 NSString+AESCrypt (https://github.com/Gurpartap/AESCrypt-ObjC)

示例:

NSString* encrypted = [plainText AES256EncryptWithKey:@"MyEncryptionKey"];
NSString* decrypted = [encrypted AES256DecryptWithKey:@"MyEncryptionKey"];

Android (AES256Cipher - https://gist.github.com/dealforest/1949873):

加密:

String base64Text="";
try {
    String key = "MyEncryptionKey";
    byte[] keyBytes = key.getBytes("UTF-8");
    byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    byte[] cipherData;

    //############## Request(crypt) ##############
    cipherData = AES256Cipher.encrypt(ivBytes, keyBytes, passval1.getBytes("UTF-8"));
    base64Text = Base64.encodeToString(cipherData, Base64.DEFAULT);
}
catch ( Exception e ) {
    e.printStackTrace();
}        

解密:

String base64Text="";
String plainText="";
try {
    String key = "MyEncryptionKey";
    byte[] keyBytes = key.getBytes("UTF-8");
    byte[] ivBytes = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    byte[] cipherData;

    //############## Response(decrypt) ##############
base64Text = User.__currentUser.getPasscode();
    cipherData = AES256Cipher.decrypt(ivBytes, keyBytes, Base64.decode(base64Text.getBytes("UTF-8"), Base64.DEFAULT));
    plainText = new String(cipherData, "UTF-8");            
}
catch ( Exception e )
{
    e.printStackTrace();
}

【讨论】:

  • 在 Objective-C 中,异常用于不可恢复的编程错误并且被认为是不可恢复的。 (分布式对象除外)。
  • 这被难住了,AESCrypt-ObjC 的默认行为是使用 nil IV,而在 java 中你必须显式设置一个空白字节数组并在此处显示。非常感谢!
【解决方案2】:

下面的链接提供了一个使用对称密钥加密的很好的加密和解密示例。

使用的对称密钥是自定义纯文本。 如果我们需要使用 IOS 设备进行解密,这会有所帮助。 该示例使用 AES 128 位加密。请注意,它使用 IV 参数。 由于加密是 128 位,所以密钥的长度应该是 16。

在 Android 端,可以使用相同的方法实现,因为语言是 Java。在IOS中CommonCryptor.h可用于加密解密。

http://www.java-redefined.com/2015/06/symmetric-key-encryption-ios-java.html

【讨论】:

  • 答案应该包含代码,而不是指向另一个站点。此外,该问题还包含使用 Java 加密的代码。
猜你喜欢
  • 2018-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2013-08-19
  • 2015-05-04
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多