iPhone의 NS 문자열에 대한 AES 암호화
문자열을 암호화하고 암호화된 데이터와 함께 다른 문자열을 반환할 수 있는 올바른 방향을 알려줄 수 있는 사람이 있습니까? (AES256 암호화를 시도해 왔습니다.)저는 두 개의 NSString 인스턴스를 사용하는 방법을 쓰고 싶습니다. 하나는 암호화할 메시지이고 다른 하나는 암호화할 '패스코드'입니다. 암호화된 데이터가 암호화된 데이터와 함께 제공되는 경우 암호화 키를 생성해야 할 것 같습니다.그런 다음 메소드는 암호화된 데이터에서 생성된 NS 문자열을 반환해야 합니다.
저는 이 게시물의 첫 댓글에 자세히 나와 있는 기술을 시도해 보았지만, 지금까지 운이 없었습니다.애플의 크립토 연습은 확실히 뭔가를 가지고 있지만, 저는 그것을 이해할 수 없습니다...저는 CCCrypt에 대한 많은 언급을 보았지만, 제가 사용한 모든 경우에서 실패했습니다.
또한 암호화된 문자열을 해독할 수 있어야 하지만 kCCEncrypt/kCCCrypt만큼 간단했으면 합니다.
코드를 게시하지 않았기 때문에 어떤 문제가 발생했는지 정확히 알 수 없습니다.하지만, 당신이 링크한 블로그 게시물은 꽤 괜찮은 것 같습니다...각각의 통화에서 쉼표를 추가하는 것 외에CCCrypt()
컴파일 오류가 발생했습니다.
그 게시물에 대한 나중의 논평은 저에게 효과적이고 좀 더 간단한 것처럼 보이는 이 적응된 코드를 포함합니다.NSData 범주에 해당 코드를 포함하면 다음과 같은 내용을 작성할 수 있습니다(참고:그printf()
호출은 다양한 지점에서 데이터의 상태를 보여주기 위한 것일 뿐입니다. 실제 애플리케이션에서는 이러한 값을 인쇄하는 것이 의미가 없습니다.)
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSString *key = @"my password";
NSString *secret = @"text to encrypt";
NSData *plain = [secret dataUsingEncoding:NSUTF8StringEncoding];
NSData *cipher = [plain AES256EncryptWithKey:key];
printf("%s\n", [[cipher description] UTF8String]);
plain = [cipher AES256DecryptWithKey:key];
printf("%s\n", [[plain description] UTF8String]);
printf("%s\n", [[[NSString alloc] initWithData:plain encoding:NSUTF8StringEncoding] UTF8String]);
[pool drain];
return 0;
}
이 코드와 암호화된 데이터가 항상 NS 문자열로 잘 변환되지는 않는다는 사실을 고려할 때, 필요한 기능을 앞뒤로 묶는 두 가지 방법을 작성하는 것이 더 편리할 수 있습니다.
- (NSData*) encryptString:(NSString*)plaintext withKey:(NSString*)key {
return [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
}
- (NSString*) decryptData:(NSData*)ciphertext withKey:(NSString*)key {
return [[[NSString alloc] initWithData:[ciphertext AES256DecryptWithKey:key]
encoding:NSUTF8StringEncoding] autorelease];
}
이것은 확실히 스노우 레오파드에서 작동하며, @Boz는 CommonCrypto가 아이폰의 코어 OS의 일부라고 보고합니다.10.4와 10.5는 모두 다음과 같습니다./usr/include/CommonCrypto
10.5에 대한 관리 페이지가 있지만CCCryptor.3cc
그리고 10.4는 그렇지 않기 때문에 YMMV.
편집: 안전한 무손실 변환을 사용하여 암호화된 데이터 바이트를 문자열(원하는 경우)로 표시하기 위해 Base64 인코딩을 사용하는 방법에 대한 후속 질문을 참조하십시오.
Jeff LaMarche의 블로그에서 발견된 솔루션과 Quinn Taylor의 Stack Overflow에 대한 힌트를 사용하는 NSData 및 NSString에 대한 카테고리 모음을 작성했습니다.
범주를 사용하여 NSData를 확장하여 AES256 암호화를 제공하고 NSString을 BASE64로 확장하여 암호화된 데이터를 문자열로 안전하게 인코딩할 수 있습니다.
다음은 문자열 암호화에 대한 사용 예입니다.
NSString *plainString = @"This string will be encrypted";
NSString *key = @"YourEncryptionKey"; // should be provided by a user
NSLog( @"Original String: %@", plainString );
NSString *encryptedString = [plainString AES256EncryptWithKey:key];
NSLog( @"Encrypted String: %@", encryptedString );
NSLog( @"Decrypted String: %@", [encryptedString AES256DecryptWithKey:key] );
여기에서 전체 소스 코드를 확인하십시오.
도움이 되는 모든 힌트에 감사드립니다!
마이클
@owlstead, "지정된 답변 중 하나의 암호화된 보안 변형"에 대한 요청과 관련하여 RNCryptor를 참조하십시오.사용자가 요청하는 작업을 정확히 수행하도록 설계되었으며 여기에 나열된 코드 문제에 대응하여 제작되었습니다.
RNCryptor는 PBKDF2를 소금과 함께 사용하고, 랜덤 IV를 제공하며, HMAC(PBKDF2에서 자체 소금으로도 생성됨)를 부착합니다.동기식 및 비동기식 작업을 지원합니다.
저는 @QuinnTaylor가 답변을 업데이트하기를 기다렸지만, 그가 업데이트하지 않았기 때문에 XCode7(그리고 아마도 더 큰)에 로드될 수 있는 방식으로 답변이 있습니다.저는 이것을 코코아 애플리케이션에서 사용했지만 iOS 애플리케이션에서도 잘 작동할 것 같습니다.ARC 오류가 없습니다.
AppDelegate.m 또는 AppDelegate.mm 파일의 @description 섹션 앞에 붙여넣습니다.
#import <CommonCrypto/CommonCryptor.h>
@implementation NSData (AES256)
- (NSData *)AES256EncryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self bytes], dataLength, /* input */
buffer, bufferSize, /* output */
&numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
//the returned NSData takes ownership of the buffer and will free it on deallocation
return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}
- (NSData *)AES256DecryptWithKey:(NSString *)key {
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [self length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesDecrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
keyPtr, kCCKeySizeAES256,
NULL /* initialization vector (optional) */,
[self 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;
}
@end
이 두 함수를 원하는 @ 구현 클래스에 붙여넣습니다.저의 경우, AppDelegate.mm 또는 AppDelegate.m 파일에서 @configurationAppDelegate를 선택했습니다.
- (NSString *) encryptString:(NSString*)plaintext withKey:(NSString*)key {
NSData *data = [[plaintext dataUsingEncoding:NSUTF8StringEncoding] AES256EncryptWithKey:key];
return [data base64EncodedStringWithOptions:kNilOptions];
}
- (NSString *) decryptString:(NSString *)ciphertext withKey:(NSString*)key {
NSData *data = [[NSData alloc] initWithBase64EncodedString:ciphertext options:kNilOptions];
return [[NSString alloc] initWithData:[data AES256DecryptWithKey:key] encoding:NSUTF8StringEncoding];
}
Please use the below mentioned URL to encrypt string using AES excryption with
key and IV values.
https://github.com/muneebahmad/AESiOSObjC
언급URL : https://stackoverflow.com/questions/1400246/aes-encryption-for-an-nsstring-on-the-iphone
'programing' 카테고리의 다른 글
:active pseudo-class는 모바일 사파리에서 작동하지 않습니다. (0) | 2023.05.31 |
---|---|
NS Notification Center와 동등한 Android (0) | 2023.05.31 |
Mac 키보드를 사용하여 iphone 시뮬레이터의 텍스트 필드를 입력할 수 없습니까? (0) | 2023.05.31 |
아이폰 사진 라이브러리에 사진을 저장하는 방법은 무엇입니까? (0) | 2023.05.31 |
layoutSubviews는 언제 호출됩니까? (0) | 2023.05.31 |