Objective C에서 md5를 키로 두 배로 사용하여 AES256 암호화를 수행하는 방법은 무엇입니까?

울버린

md5를 키로 두 배로 사용하여 AES256 암호화를 수행하는 Android 코드를 복제하려고했습니다. 모든 것이 괜찮아 보이지만 암호화 후의 값은 동일하지 않은 것 같습니다. 아래 코드를 살펴보세요

안드로이드 :-

public static String encrypt(String key, String value) {
    try {
        byte[] keyArr = new byte[32];
        MessageDigest md = MessageDigest.getInstance("MD5");
        byte[] hash = md.digest(key.getBytes("US-ASCII"));//in md5 function 1st line
        keyArr = arrayCopy(0, hash, 0, keyArr, 16);//in md5 function 1st for loop
        keyArr = arrayCopy(0, hash, 15, keyArr, 16);//in md5 function 2nd for loop
        SecretKeySpec skeySpec = new SecretKeySpec(keyArr, "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(value.getBytes());
        String encryptedB64 = new String(Base64.encode(encrypted, Base64.DEFAULT));
        return encryptedB64;
    } catch (Exception ex) {
        ex.printStackTrace();
    }
    return null;
}
private static byte[] arrayCopy(int sourceIndex,byte[] source,int targetIndex,byte[] target,int transferSize){
    if(!(transferSize >0))
        return null;
    if(sourceIndex>=0 && sourceIndex < source.length){
        int transferCnt=0;
        int i=sourceIndex;
        for(int j=targetIndex;;j++,i++){
            if(targetIndex>=target.length || sourceIndex>=source.length || (++transferCnt>transferSize)){
                break;
            }
            target[j] = source[i];
        }
    }else{
        return null;
    }
    return target;
}

iOS 목표 -c

+ (NSString *) getFalconEncryptedValueForKey:(NSString *)theKey forString:(NSString *)theString
{
    char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
    bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
    NSData *rawData = [theString dataUsingEncoding:NSUTF8StringEncoding];
    NSString *md5Key = [self md5:theKey];
    [md5Key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    NSUInteger dataLength = [rawData length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding + kCCOptionECBMode,
                                          keyPtr, kCCKeySizeAES256,
                                          NULL /* initialization vector (optional) */,
                                          [rawData bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess)
    {
        NSData *tempData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        NSString* encrypted64 = [tempData base64EncodedStringWithOptions:0];//Even i have tried base 64 encding with other options available
        return encrypted64;
    }

    free(buffer); //free the buffer;
    return nil;
}


+ (NSString *) md5:(NSString *) input
{
//    const char * pointer = [self UTF8String];
    const char *cStr = [input cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char result[CC_MD5_DIGEST_LENGTH];
    CC_MD5( cStr, (CC_LONG)strlen(cStr), result );

    NSMutableString *md5String = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [md5String appendFormat:@"%02x",result[i]];
    for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
        [md5String appendFormat:@"%02x",result[i]];

    return md5String;
    //for 32 byte. md5 produces only 16 byte info. we are replicating it again to make it 32 byte for aes256
}

내가 잘못한 일에 대한 모든 방향은 정말 도움이 될 것입니다. 미리 감사드립니다

Artjom B.

md5를 키로 두 배로 사용한 AES256 암호화

아니요, 그렇지 않습니다.

안드로이드, 최초의 마지막 바이트 hash에이 keyArr제 덮어된다 hash(제 더 정확하게 첫번째 바이트 hash). 따라서의 마지막 바이트 keyArr는 항상 0입니다.

저는 Objective-C에 능통하지 않지만 이렇게해야한다고 생각합니다.

NSMutableString *md5String = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH-1; i++)
    [md5String appendFormat:@"%02x",result[i]];
for (int i = 0; i < CC_MD5_DIGEST_LENGTH; i++)
    [md5String appendFormat:@"%02x",result[i]];
[md5String appendFormat:@"%02x",0];

(Btw arrayCopy는 수많은 검사에도 불구하고 IndexOutOfBoundsException을 생성 할 수 있습니다.)

물론 이것은 64 자 길이의 16 진수 인코딩 문자열을 생성합니다. 이것은 당신이 원하는 것이 아닙니다. 대신 길이가 32 인 실제 바이트를 생성해야합니다.

올바른 코드 (OP 별)

+ (NSString *) getEncryptedValueWithKey:(NSString *)theKey forString:(NSString *)theString
{
    NSData *rawData = [theString dataUsingEncoding:NSUTF8StringEncoding];

    unsigned char md5Buffer[kCCKeySizeAES256+1];
    memset(md5Buffer, 0, kCCKeySizeAES256+1);
    const char *cStr = [theKey UTF8String];

    // do md5 hashing
    CC_MD5(cStr, CC_MD5_DIGEST_LENGTH, md5Buffer);

    unsigned char lastChar = md5Buffer[15];
    for (NSInteger i = 15; i <= 30; i++) {
        md5Buffer[i] = md5Buffer[i-15];
    }
    md5Buffer[30] = lastChar;
    //MD5 key obtaining end

    NSUInteger dataLength = [rawData length];
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding + kCCOptionECBMode, md5Buffer, kCCKeySizeAES256, NULL /* initialization vector (optional) */, [rawData bytes], dataLength, /* input */ buffer, bufferSize, /* output */ &numBytesEncrypted);
    if (cryptStatus == kCCSuccess)
    {
        NSData *tempData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        NSString* encrypted64 = [tempData base64EncodedStringWithOptions:0];//Even i have tried base 64 encding with other options available
        return encrypted64;
    }

    free(buffer); //free the buffer;
    return nil;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관