3

iOS プロジェクトに openssl をコンパイルしてビルドしました。

しかし、このコマンドラインに同等のコードを書くことでobjective-cで苦労しています:

openssl rsautl -encrypt -inkey publicKey.pem -pubin -in textfile.txt -out encrypted.bin

どうすればこれを達成できますか?

4

2 に答える 2

5

こんにちは私は同じ問題を抱えていましたが、ついに私が探していたものを見つけました。CodeInChaosのように私が必要としているのは、自己署名証明書です。それで私のコードはうまくいきます。これを行うには、次のコマンドを使用します。

openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650

私はこの投稿が非常に役立つことを発見しました:

http://blog.iamzsx.me/show.html?id=155002

多くの質問に答えます。英語ではありませんが、グーグルはうまく翻訳されているので、大きな問題ではありません。

私はこの小さな機能を実行して、見つけたコードと自分のコードでデータを暗号化しました。バンドルに公開鍵があり、base64でエンコードされたNSDaaでメッセージを返し、サーバーに送信します。

+ (NSString *)encryptWithPublicKeyMessage:(NSString *) message
{
NSLog(@"encrypting...");
NSData *inputData = [message dataUsingEncoding:NSUTF8StringEncoding];
const void *bytes = [inputData bytes];
int length = [inputData length];
uint8_t *plainText = malloc(length);
memcpy(plainText, bytes, length);

/* Open and parse the cert*/
NSData *certData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"public_key" ofType:@"der"]];
SecCertificateRef cert = SecCertificateCreateWithData(kCFAllocatorDefault, (__bridge CFDataRef)certData);
SecPolicyRef policy = SecPolicyCreateBasicX509();
SecTrustRef trust;
OSStatus status = SecTrustCreateWithCertificates(cert, policy, &trust);

/* You can ignore the SecTrustResultType, but you have to run SecTrustEvaluate
 * before you can get the public key */
SecTrustResultType trustResult;
if (status == noErr) {
    status = SecTrustEvaluate(trust, &trustResult);
}

/* Now grab the public key from the cert */
SecKeyRef publicKey = SecTrustCopyPublicKey(trust);

/* allocate a buffer to hold the cipher text */
size_t cipherBufferSize;
uint8_t *cipherBuffer; 
cipherBufferSize = SecKeyGetBlockSize(publicKey);
cipherBuffer = malloc(cipherBufferSize);

/* encrypt!! */
SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plainText, length, cipherBuffer, &cipherBufferSize);


 NSData *d = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];

/* Free the Security Framework Five! */
CFRelease(cert);
CFRelease(policy);
CFRelease(trust);
CFRelease(publicKey);
free(cipherBuffer);
NSLog(@"encrypted");
return [d encodeBase64ForData];
}

正しいコードを見つけるのに時間がかかることが私に役立つことを願っています

于 2012-04-09T15:31:08.703 に答える
2

だから私は私の問題を解決しました.NSStringを暗号化する私の質問への関数は次のとおりです:

この質問のコードからコードを変更しました: send RSA public key to iphone and use it to encrypt

(また、コードの最後で、QSUtilitiesを使用してメッセージを base64 でエンコードします)

#pragma mark Encryption using OpenSSL
+ (NSString *)EncryptMessage:(NSString *)message {
NSString *path = [[NSBundle mainBundle] pathForResource:@"pubkey" ofType:@"pem"];
FILE *pubkey = fopen([path cStringUsingEncoding:1], "r");
if (pubkey == NULL) {
    NSLog(@"duh: %@", [path stringByAppendingString:@" not found"]);
    return NULL;
}

RSA *rsa = PEM_read_RSA_PUBKEY(pubkey, NULL, NULL, NULL);
if (rsa == NULL) {
    NSLog(@"Error reading RSA public key.");
    return NULL;
}

const char *msgInChar = [message UTF8String];
unsigned char *encrypted = (unsigned char *) malloc(512); //I'm not so sure about this size
int bufferSize = RSA_public_encrypt(strlen(msgInChar), (unsigned char *)msgInChar, encrypted, rsa, RSA_PKCS1_PADDING);
if (bufferSize == -1) {
    NSLog(@"Encryption failed");
    return NULL;
}

NSData *data = [NSData dataWithBytes:(const void *)encrypted length:512]; //I'm not so sure about this length
NSString *result = [QSStrings encodeBase64WithData:data];

free(rsa);
fclose(pubkey);
free(encrypted);

return result;
于 2012-04-18T06:20:49.387 に答える