AES/CBC/PKCS5Padding in iOS objective c result differs from Android

后端 未结 1 2091
青春惊慌失措
青春惊慌失措 2020-12-01 23:16

I am using the AES/CBC/PKCS5Padding in Android application. Code is like-

    private static String TRANSFORMATION = \"AES/CBC/PKCS5Padding\";

    private s         


        
相关标签:
1条回答
  • 2020-12-01 23:39

    everyone I hope is not too late...

    After spending time dealing with this, I got success in ANDROID(java) and IOS (Objc) using AES with the codes below:

    ANDROID CODE

        import java.io.IOException;
        import java.security.InvalidAlgorithmParameterException;
        import java.security.InvalidKeyException;
        import java.security.NoSuchAlgorithmException;
    
        import javax.crypto.BadPaddingException;
        import javax.crypto.Cipher;
        import javax.crypto.IllegalBlockSizeException;
        import javax.crypto.NoSuchPaddingException;
        import javax.crypto.spec.IvParameterSpec;
        import javax.crypto.spec.SecretKeySpec;
    
        public class SecurityUtils {
    
            private static final String ALGORITHM = "AES";
            private static final String MODE = "AES";
            private static final String IV = "AEE0715D0778A4E4";
            private static final String KEY= "9336365521W5F092BB5909E8E033BC69";
    
            public static  String encrypt(String value ) throws NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException {
                SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
                Cipher cipher = Cipher.getInstance(MODE);
                cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(IV.getBytes()));
                byte[] values = cipher.doFinal(value.getBytes());
                return Base64.encodeBytes(values);
            }
    
            public static  String decrypt(String value) throws IOException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException, InvalidKeyException {
                byte[] values = Base64.decode(value);
                SecretKeySpec secretKeySpec = new SecretKeySpec(KEY.getBytes(), ALGORITHM);
                Cipher cipher = Cipher.getInstance(MODE);
                cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(IV.getBytes()));
                return new String(cipher.doFinal(values));
            }
        }
    

    TESTING ANDROID

       try {
            String encrypted = SecurityUtils.encrypt("My Secret Text");
            String decrypted = SecurityUtils.decrypt(encrypted);
            Log.e("encrypted", encrypted);
            Log.e("decrypted", decrypted);
        }catch(Exception ex){
            Log.e("AES", ex.getMessage());
        }
    

    IOS CODE

    Header file

    #import <Foundation/Foundation.h>
    #import <CommonCrypto/CommonCryptor.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface SecurityUtils : NSObject
    
    + (NSString *)encrypt:(NSString *)plainText error:(NSError **)error;
    + (NSString *)decrypt:(NSString *)plainText error:(NSError **)error;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    Implementation file

    NSString *const IV = @"AEE0515D0B08A4E4";
    NSString *const KEY =  @"9336565521E5F082BB5929E8E033BC69";
    
    
    #import "SecurityUtils.h"
    
    
    @implementation SecurityUtils
    
    
    + (NSString *)encrypt:(NSString *)plainText error:(NSError **)error {
        NSMutableData *result =  [SecurityUtils doAES:[plainText dataUsingEncoding:NSUTF8StringEncoding] context: kCCEncrypt error:error];
        return [result base64EncodedStringWithOptions:0];
    }
    
    
    + (NSString *)decrypt:(NSString *)encryptedBase64String error:(NSError **)error {
        NSData *dataToDecrypt = [[NSData alloc] initWithBase64EncodedString:encryptedBase64String options:0];
        NSMutableData *result = [SecurityUtils doAES:dataToDecrypt context: kCCDecrypt error:error];
        return [[NSString alloc] initWithData:result encoding:NSUTF8StringEncoding];
    
    }
    
    + (NSMutableData *)doAES:(NSData *)dataIn context:(CCOperation)kCCEncrypt_or_kCCDecrypt error:(NSError **)error {
            CCCryptorStatus ccStatus   = kCCSuccess;
            size_t          cryptBytes = 0;
            NSMutableData  *dataOut    = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeBlowfish];
            NSData *key =[KEY dataUsingEncoding:NSUTF8StringEncoding];
            NSData *iv = [IV dataUsingEncoding:NSUTF8StringEncoding];
    
            ccStatus = CCCrypt( kCCEncrypt_or_kCCDecrypt,
                               kCCAlgorithmAES,
                               kCCOptionPKCS7Padding,
                               key.bytes,
                               key.length,
                               (iv)?nil:iv.bytes,
                               dataIn.bytes,
                               dataIn.length,
                               dataOut.mutableBytes,
                               dataOut.length,
                               &cryptBytes);
    
            if (ccStatus == kCCSuccess) {
                dataOut.length = cryptBytes;
            }
            else {
                if (error) {
                    *error = [NSError errorWithDomain:@"kEncryptionError"
                                                 code:ccStatus
                                             userInfo:nil];
                }
                dataOut = nil;
            }
    
            return dataOut;
    }
    
    
    @end
    

    IOS TESTING

    NSError *error;
    NSString *encrypted = [SecurityUtils encrypt:@"My Secret Text" error:&error];
    NSLog(@"encrypted: %@",encrypted);
    NSLog(@"decrypted: %@",[SecurityUtils decrypt:encrypted error:&error]);
    

    Finally, the tests outputs:

    ANDROID OUTPUT

    2019-05-16 21:35:01.215 4920-4920/br.com.my.app E/encrypted: EJ41am5W1k6fA7ygFjTSEw==
    2019-05-16 21:35:01.215 4920-4920/br.com.my.app E/decrypted: My Secret Text
    

    IOS OUTPUT

    2019-05-16 21:38:02.947043-0300 MyApp[63392:1590665] encrypted: EJ41am5W1k6fA7ygFjTSEw==
    2019-05-16 21:38:02.947270-0300 MyApp[63392:1590665] decrypted: My Secret Text
    

    My repo on github with this examples: https://github.com/juliancorrea/aes-crypto-android-and-ios

    0 讨论(0)
提交回复
热议问题