Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用RSA算法加密NSString_Ios_Objective C_Encryption - Fatal编程技术网

Ios 使用RSA算法加密NSString

Ios 使用RSA算法加密NSString,ios,objective-c,encryption,Ios,Objective C,Encryption,我有一个指数和一个模数如何使用RSA算法加密NSString。我参加过很多论坛。但我仍然感到困惑。谁能给我一个正确的方法来加密一个NSString使用RSA算法和指数和模 我目前正在尝试这个。但是仍然得到一个错误的加密字符串 publicTag = [self PublicKeyItems]; SecKeyRef publicKeyData = [self getPublicKeyRef]; NSString* result = (NSString*)[self encryptRSA:@"Sh

我有一个指数和一个模数如何使用RSA算法加密NSString。我参加过很多论坛。但我仍然感到困惑。谁能给我一个正确的方法来加密一个NSString使用RSA算法和指数和模

我目前正在尝试这个。但是仍然得到一个错误的加密字符串

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;
}
捷径

。一个主要缺点是:成本为189美元O

艰难的道路


解析XML,用于生成模数和指数的公钥数据。如果可行,请使用该公钥()创建一个伪密钥链,现在以SecKeyRef格式提取公钥,并将其传递给问题中的encryptRSA方法。最后,清除,删除虚拟钥匙链。理论上听起来不错,但我从未彻底测试过,如果你测试过,请告诉我

如果改用
[testPubKey bytes]
会怎么样?那真的只是暗中捅了一刀,因此有一条评论。。。。您将NSData对象作为一个整体提供。在调用
encryptRSA…
实现时,我肯定会尝试提供它包装的原始数据(即使用
字节
)?