在java中加密,在IOS中解密AES 128位

在java中加密,在IOS中解密AES 128位,java,ios,objective-c,encryption,Java,Ios,Objective C,Encryption,我必须在java中加密,在IOS Objective-C中使用AES 128位进行解密 我有一个Java程序 import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import sun.misc.BASE64Encoder; import

我必须在java中加密,在IOS Objective-C中使用AES 128位进行解密

我有一个Java程序

import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
import javax.crypto.spec.IvParameterSpec;

public class EncryptionDecryptionAES {
    static Cipher cipher;

    public static void main(String[] args) throws Exception {
            String plainText = "AES Symmetric Encryption Decryption";
            String Enc       = Encrypt(plainText,"testkey");
            System.out.println("Enc :" + Enc+":");
    }

    public static String Decrypt(String text, String key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] keyBytes = new byte[16];
        byte[] b = key.getBytes("UTF-8");
        int len = b.length;
        if (len > keyBytes.length)
            len = keyBytes.length;
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
        byte[] results = new byte[text.length()];
        BASE64Decoder decoder = new BASE64Decoder();
        try {
            results = cipher.doFinal(decoder.decodeBuffer(text));
        } catch (Exception e) {
            System.out.print("Erron in Decryption");
        }
        return new String(results, "UTF-8");
    }

    public static String Encrypt(String text, String key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        byte[] keyBytes = new byte[16];
        byte[] b = key.getBytes("UTF-8");
        int len = b.length;
        if (len > keyBytes.length)
            len = keyBytes.length;
        System.arraycopy(b, 0, keyBytes, 0, len);
        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(keyBytes);
        System.out.println(keyBytes);
        System.out.println(keySpec);
        System.out.println(ivSpec);
        cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);

        byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(results);
    }
}
我有Objective-C代码

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"Hello");
    NSString* str = @"wLmnAsH0wEUlk/mYEBPUSQr0pMsRIFw5kgsAMr7UpuwjJo7MoxoqyBvZmPWM5DrS";
    NSData* data = [str dataUsingEncoding:NSUnicodeStringEncoding];
    NSLog(@"%@",[data description]);
    NSString* theData = [self Decrypt: data  WithKey:@"testkey"];


    NSLog(@"%@", theData);
}


- (NSData *)Encrypt:(NSString *)data WithKey:(NSString *)key {
    return [self AESOperation:kCCEncrypt OnData:[data dataUsingEncoding:NSUTF8StringEncoding] key:key];
}


- (NSString *)Decrypt:(NSData *)data WithKey:(NSString *)key {
    return [[NSString alloc] initWithData:[self AESOperation:kCCDecrypt OnData:data key:key] encoding:NSUTF8StringEncoding];
}

- (NSData *)AESOperation:(CCOperation)operation OnData:(NSData *)data key:(NSString *)key {
    char keyPtr[kCCKeySizeAES128];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [data length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(operation,
                                          kCCAlgorithmAES128,
                                          kCCOptionPKCS7Padding,
                                          keyPtr,
                                          kCCBlockSizeAES128,
                                          keyPtr,
                                          [data bytes],
                                          dataLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSLog(@"Success");
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer);
    return nil;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
当我在iOS中运行代码时

2016-09-25 22:03:21.346 Test[15603:1297217] Hello 2016-09-25 22:03:21.346 Test[15603:1297217] 2016-09-25 22:03:21.346 Test[15603:1297217] Success 2016-09-25 22:03:21.347 Test[15603:1297217] (null) 2016-09-25 22:03:21.346测试[15603:1297217]你好 2016-09-25 22:03:21.346测试[15603:1297217] 2016-09-25 22:03:21.346测试[15603:1297217]成功 2016-09-25 22:03:21.347测试[15603:1297217](空) 我在这里将输出作为“AES对称加密-解密”进行例外,但得到null


我做错了什么?

Java代码片段使用了
PKCS5Padding
和iOS
PKCS7Padding
@Brandon本质上PKCS#5填充是PKCS#7填充实际上是可交换的。唯一的实际区别是,PKCS#5填充指定用于8字节的块大小,而PKCS#7填充指定用于最多255字节的块大小。见。注:1。不要将密钥用作IV,它应该是一个随机字节,通常作为加密数据的前缀,它的长度也是无效的。2.确保密钥的精确大小为128、192或256位,“testkey”是无效的密钥长度。3.如果您得到的结果为空,则会出现参数错误、缓冲区大小不正确或很可能是密钥大小不正确。4.检查
cryptStatus
并将其添加到问题中,错误值是否有帮助。5,您正在传递密钥大小的
kCCBlockSizeAES128
,这是不正确的,请使用kCCKeySizeAES128、kCCKeySizeAES192或kCCKeySizeAES256。@zaph明文是“AES对称加密解密”,密钥是“testkey”,加密数据是“wLmnAsH0wEUlk/MyEBPUSQR0PMSRIFW5KGSAMR7UPUWJJO7MOXQYBVZMM5DRS”
CCCrypt
的输入数据必须为二进制,“wLmnAsH0wEUlk/mYEBPUSQr0pMsRIFw5kgsAMr7UpuwjJo7MoxoqyBvZmPW‌​M5DrS“不是二进制的,它看起来像Base64编码的88字节。更正键、键长、iv和iv长度。在调用'CCCrypt'之前和之后立即提供十六进制值。如果您希望加密方法修复不正确的参数,那么互操作性可能无法工作。