欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android IOS Java通用的AES128加密解密Demo下载

程序员文章站 2021-12-28 21:42:57
...

出于安全考虑、很多App在与服务器接口的请求和响应过程中都会涉及到加密和解密的问题、如果不加的话就会是明文的、即使加了GZIP也可以被直接解压成明文、在安全性上不是很好、所以很多涉及到金额的相关的App都会加密的、但是如果同时有Android和IOS的App的话、必须要保证加密和解密的算法一致、要不然对后台没法处理

之前就写过一种AES算法只能Android和后台的加密解密一样、IOS始终调试不过、后来花了很长时间研究、发现是OC和Java对Aes的Key的处理方法不一样、很久很久之后、终于解决了问题、今天在此给大家分享一下AES的加密和解密、Android和ios通用的AES加密算法、大家可以直接集成到自己的项目、服务器接口如果是用Java写的话、整个框架都完美了、如果是.NET编写的后台接口的话、得改造一下哦


IOS加密

/*加密方法*/
  (NSString *)AES256EncryptWithPlainText:(NSString *)plain {
    NSData *plainText = [plain dataUsingEncoding:NSUTF8StringEncoding];
    // ´key´ should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256 1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
        
    NSUInteger dataLength = [plainText length];

    size_t bufferSize = dataLength   kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    bzero(buffer, sizeof(buffer));
    
    size_t numBytesEncrypted = 0;
    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,kCCOptionPKCS7Padding,
                                          [[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256,
                                          ivBuff /* initialization vector (optional) */,
                                          [plainText bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        return [encryptData base64Encoding];
    }
    
    free(buffer); //free the buffer;
    return nil;
}


IOS解密

/*解密方法*/
  (NSString *)AES256DecryptWithCiphertext:(NSString *)ciphertexts{
    
    NSData *cipherData = [NSData dataWithBase64EncodedString:ciphertexts];
    // ´key´ should be 32 bytes for AES256, will be null-padded otherwise
    char keyPtr[kCCKeySizeAES256 1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
        
    NSUInteger dataLength = [cipherData length];
    
    size_t bufferSize = dataLength   kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
        
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                          [[NSData AESKeyForPassword:PASSWORD] bytes], kCCKeySizeAES256, 
                                          ivBuff ,/* initialization vector (optional) */
                                          [cipherData bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        NSData *encryptData = [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
        return [[[NSString alloc] initWithData:encryptData encoding:NSUTF8StringEncoding] init];
    }
    
    free(buffer); //free the buffer;
    return nil;
}


Android加密

private byte[] encrypt(String cmp, SecretKey sk, IvParameterSpec IV,
        byte[] msg) {
    try {
        Cipher c = Cipher.getInstance(cmp);
        c.init(Cipher.ENCRYPT_MODE, sk, IV);
        return c.doFinal(msg);
    } catch (NoSuchAlgorithmException nsae) {
        Log.e("AESdemo", "no cipher getinstance support for "   cmp);
    } catch (NoSuchPaddingException nspe) {
        Log.e("AESdemo", "no cipher getinstance support for padding "   cmp);
    } catch (InvalidKeyException e) {
        Log.e("AESdemo", "invalid key exception");
    } catch (InvalidAlgorithmParameterException e) {
        Log.e("AESdemo", "invalid algorithm parameter exception");
    } catch (IllegalBlockSizeException e) {
        Log.e("AESdemo", "illegal block size exception");
    } catch (BadPaddingException e) {
        Log.e("AESdemo", "bad padding exception");
    }
    return null;
}


Android解密

private byte[] decrypt(String cmp, SecretKey sk, IvParameterSpec IV,
            byte[] ciphertext) {
    try {
        Cipher c = Cipher.getInstance(cmp);
        c.init(Cipher.DECRYPT_MODE, sk, IV);
        return c.doFinal(ciphertext);
    } catch (NoSuchAlgorithmException nsae) {
        Log.e("AESdemo", "no cipher getinstance support for "   cmp);
    } catch (NoSuchPaddingException nspe) {
        Log.e("AESdemo", "no cipher getinstance support for padding "   cmp);
    } catch (InvalidKeyException e) {
        Log.e("AESdemo", "invalid key exception");
    } catch (InvalidAlgorithmParameterException e) {
        Log.e("AESdemo", "invalid algorithm parameter exception");
    } catch (IllegalBlockSizeException e) {
        Log.e("AESdemo", "illegal block size exception");
    } catch (BadPaddingException e) {
        Log.e("AESdemo", "bad padding exception");
        e.printStackTrace();
    }
    return null;
}


以上是部分代码、为了让大家在使用的时候更为方法、给大家做了两个Demo、大家可以直接下载使用

ios android 加密解密源代码下载链接: android ios aes加密 密码: ih4b