2012-12-20 4 views
2

이 암호화는 초보자입니다. 나는 안드로이드와 iOS 둘 다에 대한 어플리케이션을 만들고 있는데 (AES Encryprtion을 사용하여) 서버 측에서 파일을 암호화하고 iOS와 안드로이드 어플리케이션 모두에서 클라이언트 측에서 해독해야합니다. Android 및 iOS 모두에서 AES 암호화 및 암호 해독을 수행하기 위해 인터넷에 코드가 있습니다. 제대로 작동합니다. 서버 쪽 그들은 자바를 사용하고 있습니다. 하지만 문제는 Java Encrypted File cant가 iOS 프로그램에 의해 해독 될 수 있다는 것입니다. 심지어 동일한 파일 크기를 갖지만 파일이 올바른 형식이 아닙니다. 암호 해독에 대한iOS 및 Java의 AES 암호화

public static byte[] encrypt(byte[] data, byte[] key, byte[] ivs) { 
     try { 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

      SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
      byte[] finalIvs = new byte[16]; 
      int len = ivs.length > 16 ? 16 : ivs.length; 
      System.arraycopy(ivs, 0, finalIvs, 0, len); 
      IvParameterSpec ivps = new IvParameterSpec(finalIvs); 
      cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps); 
      return cipher.doFinal(data); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    public static byte[] decrypt(byte[] data, byte[] key, byte[] ivs) { 
     try { 
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
      SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES"); 
      byte[] finalIvs = new byte[16]; 
      int len = ivs.length > 16 ? 16 : ivs.length; 
      System.arraycopy(ivs, 0, finalIvs, 0, len); 
      IvParameterSpec ivps = new IvParameterSpec(finalIvs); 
      cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivps); 
      return cipher.doFinal(data); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

아이폰 OS 코드 : 나는 아래의 코드 ...

자바 암호화 및 암호 해독 게시

- (NSData *) decryptFile:(NSString *)key withData:(NSData *)fileData { 

    char keyPtr[kCCKeySizeAES128+1]; 
    bzero(keyPtr, sizeof(keyPtr)); 

    NSString* iv = @"12345678"; 

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    NSUInteger dataLength = [fileData length]; 

    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesDecrypted = 0; 

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,keyPtr, kCCKeySizeAES128, 
              iv /* initialization vector (optional) */, 
              [fileData bytes], dataLength, /* input */ 
              buffer, bufferSize, /* output */ 
              &numBytesDecrypted); 

    if (cryptStatus == kCCSuccess) { 
     //the returned NSData takes ownership of the buffer and will free it on deallocation 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted]; 
    } 

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

것은 나에게이 문제에 대한 모든 솔루션이나 제안을 내놔

+2

사본 및 운동을하지 프로그래밍 붙여 넣기 아래 링크를 참조하십시오? 믿을 수가 없어 ... –

+0

그렉 (GregS), 나는 복사 및 붙여 넣기가 작동하지 않을 것이라고 믿었다. 이 암호화 및 암호 해독에 대해 배우기 시작했습니다. 귀하의 회신에 대한 Thnx ..... – Mahes

+0

여기에 내 Xandrus 답변을보십시오 http://stackoverflow.com/questions/17535918/aes-gets-different-results-in-ios-and-java/19219704#19219704 –

답변

5

문제는 iv 매개 변수와 관련되어 있습니다.

1) NSString*iv으로 전달합니다. 아마 실제 바이트를 전달하고 싶을 것이다.

2) iv의 길이는 CCCrypt의 api 문서와 같이 16 (이 경우)이어야합니다.

http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h

+1

우리는 iv 용어를 제거하여이 문제를 해결했으며 패딩 모드를 약간 변경했습니다. 회신을 위해 thnx ... – Mahes

+1

@Mahes 정확히 무엇을했는지 정확하게 말할 수 있습니까? 특히 "패딩 모드의 작은 변화"? – CedricSoubrie

+0

@Mahes, 답변 섹션에서 암호화 (ios) 및 암호 해독 (java) 코드를 공유 할 수 있습니다. 희망은 그것이 많은 사람들을 도울 것입니다 ... – NAZIK