【问题标题】:AES/CBC/PKCS5 Padding and MD5 in iOS and AndroidiOS 和 Android 中的 AES/CBC/PKCS5 填充和 MD5
【发布时间】:2017-04-08 07:39:40
【问题描述】:

我在 Android 应用程序中使用 AES/CBC/PKCS5Padding。代码就像-

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

private static String ALGORITHM = "AES";
private static String DIGEST = "MD5";

private static Cipher cipher;
private static SecretKey password;
private static IvParameterSpec IVParamSpec;
private final static String pvtkey="GDNBCGDRFSC$%#%=";

//16-byte private key
private static byte[] IV = pvtkey.getBytes();

public PassWordEncryptor() {
    try {

        //Encode digest
        MessageDigest digest;           
        digest = MessageDigest.getInstance(DIGEST);            
        password = new SecretKeySpec(digest.digest(pvtkey.getBytes()), ALGORITHM);

        //Initialize objects
        cipher = Cipher.getInstance(TRANSFORMATION);
        IVParamSpec = new IvParameterSpec(IV);

    } catch (NoSuchAlgorithmException e) {
        Log.i(Lams4gApp.TAG, "No such algorithm " + ALGORITHM);
    } catch (NoSuchPaddingException e) {
        System.out.println( "No such padding PKCS7"+ e);
    }
}
/**
Encryptor.

@text String to be encrypted
@return Base64 encrypted text

*/
public String encrypt(byte[] text) {

    byte[] encryptedData;

    try {

        cipher.init(Cipher.ENCRYPT_MODE, password, IVParamSpec);
        encryptedData = cipher.doFinal(text);

    } catch (InvalidKeyException e) {
        System.out.println( "Invalid key  (invalid encoding, wrong length, uninitialized, etc)."+ e);
        return null;
    } catch (InvalidAlgorithmParameterException e) {
        System.out.println( "Invalid or inappropriate algorithm parameters for " + ALGORITHM+ e);
        return null;
    } catch (IllegalBlockSizeException e) {
        System.out.println( "The length of data provided to a block cipher is incorrect"+ e);
        return null;
    } catch (BadPaddingException e) {
        System.out.println( "The input data but the data is not padded properly."+ e);
        return null;
    }               
    return Base64.encodeToString(encryptedData,Base64.DEFAULT);

}

和 iOS 代码一样-

- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv
{
    char keyPtr[kCCKeySizeAES128 + 1];
    bzero(keyPtr, sizeof(keyPtr));
    //keyPtr = [58,-43,46,33,-105,83,-80,-5,99,59,2,109,63,89,-59,-91];
    key = [key MD5];
    [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 = 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;
}

如果我在两个代码中都不使用MD5 digest,结果是相同的。但是,如果我在 android 和 iOS 中使用 MD5,那么结果会有所不同。如果我使用 128 bit,那么结果完全相同。

请帮忙。

【问题讨论】:

    标签: android ios encryption aes md5


    【解决方案1】:

    这有很多问题。

    1. 在您的 iOS 代码中,您似乎正在调用 MD5 方法 key,这只是一个NSString。您需要实现MD5 该课程的摘要。 Example implementation
    2. 在您的 Java 代码中,您使用相同的值作为键和 四。这非常危险,可能会导致密钥泄露 价值。为 IV 使用唯一的、随机的、不可预测的值 使用给定密钥加密的每条消息。
    3. MD5 是一个非常弱的(事实上,已弃用且不被视为“加密安全”)摘要函数。在这种情况下,您将其用作密钥派生函数 (KDF),以从一些“人类可读且可记忆”的输入(通常是密码)派生 key。 MD5 派生很容易在商品硬件上在几秒钟内被暴力破解。使用bcryptscryptPBKDF2 with HMAC/SHA-256 和高工作系数来派生这些密钥。

    【讨论】:

    • 谢谢@Andy,我会检查的。非常感谢。
    猜你喜欢
    • 2011-06-24
    • 2022-06-10
    • 2021-08-16
    • 2019-06-17
    • 1970-01-01
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多