1

私は指数と法を持っています。RSA アルゴリズムを使用して NSString を暗号化するにはどうすればよいですか。私は多くのフォーラムを経験しました。しかし、それでも紛らわしいと思います。指数と係数を使用してRSA アルゴリズムを使用してNSStringを暗号化する正しい方法を誰か教えてもらえますか?

私は現在これを試しています。しかし、それでも間違った暗号化文字列を取得します

publicTag = [self PublicKeyItems];
SecKeyRef publicKeyData = [self getPublicKeyRef];

NSString* result = (NSString*)[self encryptRSA:@"Shob" key:publicKeyData];

そして、以下の実装

- (NSData *)PublicKeyItems
{
    NSMutableArray *publicarray = [[NSMutableArray alloc] init];
    [publicarray addObject:encryptionExponent];
    [publicarray addObject:encryptionModulus];
    NSData *testData = [publicarray berData];
    NSLog(@"testdata = %@",testData);
    return testData;
}

-(SecKeyRef)getPublicKeyRef 
{

OSStatus sanityCheck = noErr;
SecKeyRef publicKeyReference = NULL;

if (publicKeyReference == NULL) {
    [self generateKeyPair:512];
    NSMutableDictionary *queryPublicKey = [[NSMutableDictionary alloc] init];

    // Set the public key query dictionary.
    [queryPublicKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
    [queryPublicKey setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
    [queryPublicKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
    [queryPublicKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];


    // Get the key.
    sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryPublicKey, (CFTypeRef *)&publicKeyReference);


    if (sanityCheck != noErr)
    {
        publicKeyReference = NULL;
    }


    //        [queryPublicKey release];

} else { publicKeyReference = publicKey; }

return publicKeyReference;
}

- (void)generateKeyPair:(NSUInteger)keySize {
OSStatus sanityCheck = noErr;
publicKey = NULL;
privateKey = NULL;

//  LOGGING_FACILITY1( keySize == 512 || keySize == 1024 || keySize == 2048, @"%d is an invalid and unsupported key size.", keySize );

// First delete current keys.
//  [self deleteAsymmetricKeys];

// Container dictionaries.
NSMutableDictionary * privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary * publicKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary * keyPairAttr = [[NSMutableDictionary alloc] init];

// Set top level dictionary for the keypair.
[keyPairAttr setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[keyPairAttr setObject:[NSNumber numberWithUnsignedInteger:keySize] forKey:(__bridge id)kSecAttrKeySizeInBits];


// Set the public key dictionary.
[publicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];
[publicKeyAttr setObject:publicTag forKey:(__bridge id)kSecAttrApplicationTag];
// See SecKey.h to set other flag values.

// Set attributes to top level dictionary.
[keyPairAttr setObject:publicKeyAttr forKey:(__bridge id)kSecPublicKeyAttrs];

// SecKeyGeneratePair returns the SecKeyRefs just for educational purposes.
sanityCheck = SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr, &publicKey, &privateKey);
//  LOGGING_FACILITY( sanityCheck == noErr && publicKey != NULL && privateKey != NULL, @"Something really bad went wrong with generating the key pair." );
if(sanityCheck == noErr  && publicKey != NULL && privateKey != NULL)
{
    NSLog(@"Successful");
}
//  [privateKeyAttr release];
//  [publicKeyAttr release];
//  [keyPairAttr release];
}

-(NSString *)encryptRSA:(NSString *)plainTextString key:(SecKeyRef)publicKeyNext {
size_t cipherBufferSize = SecKeyGetBlockSize(publicKeyNext);
uint8_t *cipherBuffer = malloc(cipherBufferSize);
uint8_t *nonce = (uint8_t *)[plainTextString UTF8String];
SecKeyEncrypt(publicKeyNext,
              kSecPaddingOAEP,
              nonce,
              strlen( (char*)nonce ),
              &cipherBuffer[0],
              &cipherBufferSize);
NSData *encryptedData = [NSData dataWithBytes:cipherBuffer length:cipherBufferSize];
NSString* encryptedString       =   [NSString stringWithFormat:@"%@",encryptedData];
return encryptedString;
}
4

1 に答える 1

0

簡単な方法

Chilkat iOS RSA ライブラリを使用します。1 つの大きな欠点: コストは 189 ドルです! :O

難しい方法

XML を解析し、S​​CZ-BasicEncodingRules-iOSを使用して、法と指数から公開鍵データを生成します。それが機能する場合は、その公開鍵を使用してダミーのキーチェーンを作成し (こちらのサンプル コードに従ってください)、公開鍵を SecKeyRef 形式で抽出し、問題の encryptRSA メソッドに渡します。最後に、クリーンアップして、ダミー キーチェーンを取り外します。理論的には良さそうですが、これを徹底的にテストしたことはありません。

于 2013-11-11T10:19:42.467 に答える