Шифрование iOS Triple DES, генерирующее другую строку для Android - PullRequest
0 голосов
/ 30 апреля 2018

Я использовал шифрование TripleDES в своем приложении для Android, и оно возвращает ожидаемую строку по мере необходимости. Однако при реализации той же функции в iOS с использованием CommonCrypto возвращаемая строка отличается от ожидаемой.

    public String encrypt(String message, String secretKey) throws Exception {

    MessageDigest md = MessageDigest.getInstance("md5");
    byte[] digestOfPassword = md.digest(secretKey.getBytes("utf-8"));
    byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);

    for (int j = 0, k = 16; j < 8;) {
        keyBytes[k++] = keyBytes[j++];
    }

    KeySpec keySpec = new DESedeKeySpec(keyBytes);
    SecretKey key = SecretKeyFactory.getInstance("DESede").generateSecret(keySpec);

    Cipher cipher = Cipher.getInstance("DESede");
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] plainTextBytes = message.getBytes("utf-8");
    byte[] buf = cipher.doFinal(plainTextBytes);
    byte[] base64Bytes = Base64.encodeBase64(buf);
    String base64EncryptedString = new String(base64Bytes);

    return base64EncryptedString;
}

Код iOS

    + (NSData*)transformData:(NSData*)inputData operation:(CCOperation)operation withPassword:(NSString*)password
{
    NSData* key = [self keyFromPassword:password];
    //NSData* iv = [self ivFromPassword:password];
    NSMutableData* outputData = [NSMutableData dataWithLength:(inputData.length + kCCBlockSize3DES)];

    size_t outLength;
    CCCryptorStatus result = CCCrypt(operation, kCCAlgorithm3DES, kCCAlgorithmDES, key.bytes, key.length, nil, inputData.bytes, inputData.length, outputData.mutableBytes, outputData.length, &outLength);


    if (result != kCCSuccess)
        return nil;

    [outputData setLength:outLength];

    return outputData;
}

+ (NSData*)keyFromPassword:(NSString*)password
{
    NSString* key = [password copy];
    int length = kCCKeySize3DES;

    while (key.length < length)
        key = [key stringByAppendingString:password];

    if (key.length > length)
        key = [key substringToIndex:length];

    return [key dataUsingEncoding:NSUTF8StringEncoding];
}

+ (NSData*)ivFromPassword:(NSString*)password
{
    NSString* key = [password copy];
    int length = 8;

    while (key.length < length)
        key = [key stringByAppendingString:password];

    if (key.length > length)
        key = [key substringToIndex:length];

    return [key dataUsingEncoding:NSUTF8StringEncoding];
}

Может быть полезно отметить, что используемый ключ является 20-байтовым ключом. Я ограничен 20-байтовым ключом. Android-приложение автоматически устраняет это ограничение с помощью функции Array.copyOf, однако, несмотря на нулевое заполнение и повторение первых символов клавиши в качестве последних восьми символов, я все еще не могу воспроизвести вывод в iOS.

Любая помощь будет оценена.

...