在IOS中加密和在IOS中解密对于AES 128位

时间:2016-09-26 02:16:50

标签: java ios objective-c encryption

我必须使用AES 128位在IOS Objective-C中使用Java加密和Decrypt

我有这个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)

我在这里除了输出“AES Symmetric Encryption Decryption”但是变为null。

我做错了什么?

0 个答案:

没有答案