简体   繁体   English

Java字符串加密

[英]Java string encrypt

I am using the encryption class in Objective C for my iPhone app but I am struggling to get the same functionality working in JAVA from my android app. 我在Objective C中使用加密类作为我的iPhone应用程序,但我很难从我的Android应用程序中获得在JAVA中工作的相同功能。 My encryption code is below: 我的加密代码如下:

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];

I have tried to replicate it in JAVA but I get a different string when I encode the same data. 我试图在JAVA中复制它,但是当我编码相同的数据时,我得到一个不同的字符串。 So I am doing something wrong but I can't figure it out. 所以我做错了什么,但我无法弄清楚。 Here is my JAVA code: 这是我的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());

Can anyone see where I am going wrong? 任何人都可以看到我错在哪里?

Based on the comments below I added getBytes but the strings produced are still different: 基于以下评论,我添加了getBytes,但生成的字符串仍然不同:

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);

Here is a sample of encryption and decryption: 以下是加密和解密的示例:

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;
}

To encrypt: 要加密:

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

to decrypt 解密

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

Instead of using ECB, you ought to use CBC or CTR if possible. 如果可能,您应该使用CBC或CTR,而不是使用ECB。 ECB is insecure . 欧洲央行不安全

It looks like your Objective-C code is using UTF-8 encoding, but you're not specifying this in your Java code. 看起来您的Objective-C代码使用的是UTF-8编码,但您没有在Java代码中指定它。 Use getBytes("UTF-8") . 使用getBytes("UTF-8")

One thing that I've noticed that has caused problems in the past is that the iOS string being encrypted is actually "Hello World\\0" , eg the string to be encrypted with an extra null at the end. 我注意到的一件事在过去引起的问题是加密的iOS字符串实际上是"Hello World\\0" ,例如最后要加密的字符串加密。 so try adding a \\0 to the end of your string in Java and see if it produces the same results. 所以尝试在Java中将字符串末尾添加\\0 ,看看它是否产生相同的结果。

Additionally, the URLEncoder step on java may be introducing extra control characters and other things that are not present on the iOS side. 另外,java上的URLEncoder步骤可能会引入额外的控制字符以及iOS端不存在的其他内容。 It may be worthwhile to compare the text after this with the text going into the iOS encryption step to ensure that they are exactly the same 将此后的文本与进入iOS加密步骤的文本进行比较以确保它们完全相同可能是值得的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM