AES_CBC Шифрование в IOS Добавление соли и итерации - PullRequest
1 голос
/ 11 октября 2019

Я хочу зашифровать свой код с помощью режима AES_CBC в ios, у меня есть ссылка на код Android (в Android используется bouncycastle.crypto).

Я пытался использовать AESEncryption в ios. но я нашел одно отличие, они используются (SALT и ITERATION_COUNT), есть ли способ добавить в IOS (SALT и ITERATION_COUNT). Пожалуйста, помогите мне решить эту проблему

Android Reference:-

private static final int ITERATION_COUNT = 100;

private static final byte[] SALT = new byte[] { (byte) 28,
                                             (byte) 116,
                                             (byte) 95,
                                             (byte) 222,
                                             (byte) 35,
                                             (byte) 65,
                                             (byte) 43,
                                             (byte) 20 };
inputData:-
    //key:   McBLVcxzJTtJ74yRouQ0bw==    

    //rawValue:
011101010010100101000111110010000000100101100110111110010010000000100010000101110001111000101110110111001000010110100001100011010110100111110010010011101011010011010100010111010010110011011010010010110011001101011001010110001011010011101000100001000100011010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

   public static byte[] encryptAesCbc(byte[] rawValue, String key) {
    try {
      CipherParameters chiperParams = getKey(key);
      BufferedBlockCipher cipherEncrypt = new PaddedBufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
      cipherEncrypt.init(true, chiperParams);
      return processData(rawValue, cipherEncrypt);

    }
    catch(Exception e) {

    }
    return new byte[0];
  }

public static CipherParameters getKey(String key) {
        final PBEParametersGenerator paramKeyGenerator = new PKCS12ParametersGenerator(new SHA256Digest());
        paramKeyGenerator.init(PKCS12ParametersGenerator.PKCS12PasswordToBytes(key.toCharArray()), SALT, ITERATION_COUNT);
        return paramKeyGenerator.generateDerivedParameters(Integer.parseInt("256"), Integer.parseInt("128"));
 }

Выход:. 1000000000000000000000001000000000000000000010110000011100001011000001110000100000001101000010100000001110010110000000110000100100000111000011011000100100001000000000111001000000000011000010000000110000001101000011000000110110010011000000001010000000111011

1007 * // IOS код ссылки :-( Как добавить соль и граф итерация) 1009 * //Шифрует или дешифрует на основе CCOperation
- (NSData *) aes128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv ecb:(BOOL) ecb {
    char keyPtr[kCCKeySizeAES128 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    char ivPtr[kCCBlockSizeAES128 + 1];
    bzero(ivPtr, sizeof(ivPtr));
    if (iv) {
        [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding];
    }

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

    size_t numBytesEncrypted = 0;



   CCCryptorStatus cryptStatus;

    if (ecb) {
        cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding | kCCOptionECBMode, keyPtr,  kCCBlockSizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);
    } 
else {
        cryptStatus = CCCrypt(operation, kCCAlgorithmAES128, kCCOptionPKCS7Padding, keyPtr,  kCCBlockSizeAES128, ivPtr, [self bytes], dataLength, buffer, bufferSize, &numBytesEncrypted);
    }

    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer);
    return nil;
}
...