简体   繁体   English

iOS生成RSA非随机密钥对?

[英]iOS Generate RSA non Random key pair?

i want to generate same asymmetric key pair every time i apply same seed. 我想每次应用相同的种子时都生成相同的不对称密钥对。

i have used iOS RSA crypto exercise to generarte RSA Asymmetric key pair. 我已经使用iOS RSA加密算法来生成RSA非对称密钥对。 i also apply same seed every time. 我也每次都用同样的种子。 (public and private tags) However, i receive different keys each time i generate. (公共和私有标签)但是,每次生成时,我都会收到不同的密钥。

- (void)generateKeyPair:(NSUInteger)keySize {
    OSStatus sanityCheck = noErr;
    publicKeyRef = NULL;
    privateKeyRef = 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:(id)kSecAttrKeyTypeRSA forKey:(id)kSecAttrKeyType];
    [keyPairAttr setObject:[NSNumber numberWithUnsignedInteger:keySize] forKey:(id)kSecAttrKeySizeInBits];

    // Set the private key dictionary.
    [privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecAttrIsPermanent];
    [privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecAttrCanEncrypt];
    [privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(id)kSecAttrCanDecrypt];

     [privateKeyAttr setObject:privateTag forKey:(id)kSecAttrApplicationTag];
    // See SecKey.h to set other flag values.

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

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

    // SecKeyGeneratePair returns the SecKeyRefs just for educational purposes.
    sanityCheck = SecKeyGeneratePair((CFDictionaryRef)keyPairAttr, &publicKeyRef, &privateKeyRef);
    LOGGING_FACILITY( sanityCheck == noErr && publicKeyRef != NULL && privateKeyRef != NULL, @"Something really bad went wrong with generating the key pair." );


    NSLog(@"getPublicKeyBits: %@", [self getPublicKeyBits]);

    NSLog(@"getPublicKeyExp: %@", [self getPublicKeyExp]);
    NSLog(@"getPublicKeyMod: %@", [self getPublicKeyMod]);


   // NSLog(@"keyPairAttr: %@" , keyPairAttr);
    [privateKeyAttr release];
    [publicKeyAttr release];
    [keyPairAttr release];
}

The "public and private tags" that you are setting are simply identifiers that you can search for later using SecItemCopyMatching if you store the key pair in the key chain. 您正在设置的“公共和私有标签”只是标识符,如果您将密钥对存储在密钥链中,则可以稍后使用SecItemCopyMatching搜索。

Unfortunately, you cannot set the "seed" value for assymetric key pairs using SecKeyGeneratePair or SecKeyGeneratePairAsync . 不幸的是,您不能使用SecKeyGeneratePairSecKeyGeneratePairAsync密钥对设置“种子”值。 You will always get "randomly generated" key pairs. 您将始终获得“随机生成的”密钥对。

If you must do this, you will have to look at other libraries that provide that functionality. 如果必须这样做,则必须查看提供该功能的其他库。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM