2015-06-23 7 views
5

पर आरएसए कुंजी को कैसे परिवर्तित करें मैं एप्पल सुरक्षा ढांचे का उपयोग कर एक एसएसएच को जेनरेट की गई सार्वजनिक आरएसए कुंजी को बदलने की कोशिश कर रहा हूं।एसएसए-आरएसए

- (void)generatePrivateKey { 
    NSDictionary *privateKeyAttr = @{(__bridge id)kSecAttrIsPermanent: @YES, 
            (__bridge id)kSecAttrApplicationTag: self.privateTag}; 
    NSDictionary *publicKeyAttr = @{(__bridge id)kSecAttrIsPermanent: @YES, 
            (__bridge id)kSecAttrApplicationTag: self.publicTag}; 


    NSDictionary *keyPairAttr = @{(__bridge id)kSecAttrKeySizeInBits: @1024, 
            (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA, 
            (__bridge id)kSecPrivateKeyAttrs: privateKeyAttr, 
            (__bridge id)kSecPublicKeyAttrs: publicKeyAttr}; 

    SecKeyRef publicKey; 
    SecKeyRef privateKey; 

    SecKeyGeneratePair((__bridge CFDictionaryRef)keyPairAttr, &publicKey, &privateKey); 
} 

- (NSString *)getPublicKey { 
    NSString *contents = [self keyForTag:self.publicTag]; 
    return [NSString stringWithFormat:@"-----BEGIN RSA PUBLIC KEY-----\n%@\n-----END RSA PUBLIC KEY-----", contents]; 
} 

- (NSString *)getPrivateKey { 
    NSString *contents = [self keyForTag:self.privateTag]; 
    return [NSString stringWithFormat:@"-----BEGIN RSA PRIVATE KEY-----\n%@\n-----END RSA PRIVATE KEY-----", contents]; 
} 

- (NSString *)keyForTag:(NSData *)tag { 
    NSDictionary *queryKey = @{(__bridge id)kSecClass: (__bridge id)kSecClassKey, 
             (__bridge id)kSecAttrApplicationTag: tag, 
             (__bridge id)kSecAttrKeyType: (__bridge id)kSecAttrKeyTypeRSA, 
             (__bridge id)kSecReturnData: @YES}; 

    // Get the key bits. 
    CFDataRef keyBits; 
    OSStatus sanityCheck = SecItemCopyMatching((__bridge CFDictionaryRef)queryKey, (CFTypeRef *)&keyBits); 
    NSData *passDat = (__bridge_transfer NSData *)keyBits; 

    if (sanityCheck != noErr) { 
     passDat = nil; 
    } 

    NSString *contents = [passDat base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]; 
    return contents; 
} 

तो मैं इस तरह की एक निजी कुंजी के साथ अंत:

यहाँ कोड मैं कुंजी युग्म पैदा करने के लिए उपयोग कर रहा हूँ है

-----BEGIN RSA PRIVATE KEY----- 
MIICXQIBAAKBgQD0SvIfWFU1EzKD8rSUMWVcE9t52WtJCIKDyMPYiu3/VV9TBci7 
7QocSl400yqjn5eX2piGRO5o/Wh/BKUdC/IzZbAb15jboKvgkE0R+EBnAs+zo2HJ 
Y1sZwT4Bc9d1ClvhHpYdE9EwpPc1IIfsz+Sa41Z0wDXqWk90A33BqIcs3wIDAQAB 
AoGBAMYvxx4G25mjaWgCjt1q9YAt2/COoqstbDTdu4UBsPNkn2ELYD6Vn440Bxlz 
9zOnVaSsgvDrGz+x1gS2D/3woxtuqSHThEOQSHugbtDMEaZ7Pawrj7zVAZQ4PPhD 
l9HNf4huhAnvDA9YE73rfQst4+vq0KpPjFHCKcEaQxLu7Y4BAkEB/UeBEdXbJ2e8 
ReGmH11/glszpiS+MosJIk/d68la1B5A5gSw6MO4GHNzPUnsNVKJXPYKYPmLDP33 
zrYXXXb/MQJAesyFhqM6TtY6IHXQyu43e6iemzAPjx2s9l0SgNAjH25JLS7tHcXo 
2gA5JcA+LqS93ei/4lLwOCd7uX9qko2JDwJBARhfdT9MbQqUoaIXSE2cO8aYTyb4 
s30/7hdlwNc+UzLUNQZtLrf2iDNt29OyDsiMV/NFwRECUPsmFndG6DYcfQECQHe/ 
ISZd3eoq9ZvZx7Vb/zbTA3eJsmJ5KcVElVqPnPB1d15cOFWkPKD5PsEVao3JkGzp 
HtTw09euiPQm0CIBavkCQQC/GU6l+khFqewNmO5+cok6wSVpqw3paGL8bxIwgifT 
yPv42Biyf3gmXtdP//tpyXPlzn6HPqf6PqFGEGvSpPDk 
-----END RSA PRIVATE KEY----- 

ssh-keygen में इस लाना निम्नलिखित सार्वजनिक पैदा करता है कुंजी:

$ ssh-keygen -f test.p12 -y 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC7VWIi0kXyx/UCGG91iGqKjohRLIj9hp44Xwd/pIApBHo38/noUeqN07S4oGgx47zZthg3zKFP90eEdKKOXZ0yuQKOy+yB5YAYg7e9FVvxfXCOVrGaZohh37HLUql/bdOzTK6/Upjl0ZZNYpxWyfIZ/8jKCAaTG6BhPQhLmWxCQw== 

मेरा प्रश्न यह है किकैसे करेंऐप्पल सुरक्षा ढांचे या ओपनएसएसएच के साथ?

अद्यतन:

मैं अब सीधे OpenSSL उपयोग कर रहा हूँ और एक मान्य RSA कुंजी मिलता है। हालांकि रूपांतरण अभी भी सही ढंग से काम नहीं कर रहा है:

- (NSString *)publicKey { 
    RSA *rsa = self.rsaPrivateKey; 

    // Encode the "ssh-rsa" string 
    NSMutableData *sshrsa = [[NSMutableData alloc] init]; 
    const char start[] = {0, 0, 0, 7, 's', 's', 'h', '-', 'r', 's', 'a'}; 
    [sshrsa appendBytes:start length:sizeof(start)]; 

    // Encode the RSA encoding exponent e 
    { 
     const char *e = BN_bn2dec(rsa->e); 
     NSString *length = [NSString stringWithFormat:@"%04lu", strlen(e)] ; 
     [sshrsa appendData:[length dataUsingEncoding:NSUTF8StringEncoding]]; 
     [sshrsa appendBytes:e length:strlen(e)]; 
    } 

    // Encode the RSA modul n 
    { 
     const char *n = BN_bn2dec(rsa->n); 
     NSString *length = [NSString stringWithFormat:@"%04lu", strlen(n)] ; 
     [sshrsa appendData:[length dataUsingEncoding:NSUTF8StringEncoding]]; 
     [sshrsa appendBytes:n length:strlen(n)]; 
    } 

    return [sshrsa base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithCarriageReturn];; 
} 

नया कुंजी

ssh-rsa AAAAB3NzaC1yc2EAAAAG4AAAATYwvdcavn8AALOV1CoAAAAG4HHTGr5/AAAwyNcavn8AAPAq1xq+fwAAkPBhBwEAAAC2hnJUVxt7AO3JLixNzOwBALilG75/AABQsaUbvn8AAJC2pRu+fwAAELGlG75/AABZVMwDAQAAAECupRu+fwAAsJsHXP9/AAAIC7kDAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHB3QAAAAAAA2IRA8A/wGr5/AAAAUvAavn8AAJBV4xq+fwAAAFLwGr5/AACQc4Ybvn8AAABS8Bq+fwAAAI4CHr5/AACQc4Ybvn8AAJBzhhu+fwAA4DGwG75/AACfAZIEAQAAAABS8Bq+fwAAUACBG75/AAA9j24JAQAAAFAAgRu+fwAAAFLwGr5/AADgMbAbvn8AAAAAAAAAAAAA4A== 

जो अब तरीका है की तुलना में यह होना चाहिए:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC+gK0cEEgn/dDk+Sf/AdQtHp2rJoG7DxMuw2hL0+96rdKeixXVXWCE8GqMg7xIU8kSn0lrfcCJDhVBkArmlnlrZDfv1lTItBU7PvV4eDLT+3kApoqYMUmmo/ecDRyAaaOecoVZTl27RZghXcS7yxABlbVhYLzJEywOi46A9yBMFQ== 
+0

क्या आप अपडेट कर सकते हैं कि आपने एसएसएच कुंजी कैसे उत्पन्न किया? मैं आपके जैसा ही समस्या से फंस गया हूं; ( –

उत्तर

3

मेटा: उत्तर का कम से कम हिस्सा, लेकिन मुझे ओबीजेसी नहीं पता है ताकि सुधार के लिए सीडब्ल्यू बना सके।

नोट: यह सिवाय इसके कि सी नहीं ObjC में है Convert pem key to ssh-rsa format के लगभग डुप्लिकेट है, और यह एक privatekey फ़ाइल के बजाय एक publickey फ़ाइल से शुरू होता है - लेकिन OpenSSL के इन-स्मृति RSA कुंजी के लिए संरचना एक के लिए एक ही है publickey या privkey, निजीकी विशिष्ट क्षेत्रों के साथ एक publickey के लिए अनदेखा किया। और इसे बेहतर किया जा सकता है।

आपका कोड (जाहिरा तौर पर) दशमलव के रूप में 4 अंक और एक दशमलव परिमाण के प्रतिनिधित्व में लंबाई मूल्य उत्पन्न करता है ई और एन, लेकिन unbase64'ing से प्रत्येक के लिए (हस्ताक्षर के बाद से मूल्य हमेशा सकारात्मक है) के बिना आपके पोस्ट आउटपुट में से कोई भी वास्तव में परिणाम में शामिल नहीं दिखाता है, जो आपके start से मेल खाने वाले सही प्रारंभिक भाग के बाद कचरा प्रतीत होता है, और मुझे नहीं पता कि क्यों। आपको वहां कुछ ओबीजेसी डीबगिंग सहायता की आवश्यकता हो सकती है।

वैसे भी, सही एन्कोडिंग 4 बाइट है द्विआधारी (bigendian) लंबाई, एक द्विआधारी bigendian मूल्य के दो के पूरक में प्रतिनिधित्व, जिसमें एक सकारात्मक संख्या के लिए एक अग्रणी शून्य बाइट जोड़ने की आवश्यकता है, जिसके बाद रेंज 2 8k/2 से 2 8k -1; यह आम तौर पर एन के मामले में होता है क्योंकि आरएसए कुंजी आकार आमतौर पर 8 में से एक का चयन किया जाता है (वास्तव में 2 या उससे कम की शक्ति)। ई शायद ही कभी इस तरह से चुना जाता है हालांकि यह हो सकता है। https://tools.ietf.org/html/rfc4251#section-5 में "स्ट्रिंग" और "mpint" देखें।

आप इसेपर कॉल करके BN_bn2bin पर बाइनरी बिगेंडियन परिमाण को बड़े-बड़े बफर में प्राप्त करने के लिए कर सकते हैं, फिर 4-बाइट लंबाई, संभावित 1-बाइट साइन और परिमाण को फिर से बड़े पैमाने पर एन्कोड कर सकते हैं बफर। या ओपनएसएसएल वास्तव में आपके लिए बहुत कुछ कर सकता है; एक बड़े पर्याप्त बफर के साथ BN_bn2mpi पर कॉल करें और यह लंबाई, संभावित संकेत और परिमाण करेगा।

ओबीजेसी में बफर (एस?) को आवंटित और प्रबंधित करने के लिए मैं आपको या किसी और को छोड़ देता हूं। ध्यान दें कि लम्बाई फ़ील्ड और मान भाग दोनों वैध बाइट मान के रूप में शून्य बाइट का उपयोग कर सकते हैं; इसे टर्मिनेटर या अन्यथा विशेष रूप से नहीं माना जाना चाहिए। थोड़ा गुगल मुझे यह सुझाव देता है कि NSString के लिए समस्या हो सकती है लेकिन मैं आसानी से गलत हो सकता था।

0

जो भी ssh-keygen यह शायद हो जाएगा करता है एसएसएच विशिष्ट और ऐप्पल के सुरक्षा ढांचे में इसे शामिल नहीं किया जा सकता है।

यह क्या do_print_publickey.c में ssh-keygen.c और write_key में करता है और सिर्फ इतना है कि नकल की जांच करने के लायक हो सकता है।

या libssh2 के libssh2_userauth_publickey_fromfile फ़ंक्शन का उपयोग करने पर विचार करें।

+0

मैंने अपने प्रश्न पर एक अद्यतन डाला क्योंकि यह अभी भी काम नहीं कर रहा है। मैं यह नहीं समझ सकता कि एसएसएच-कीजेन रूपांतरण कहां करता है। जब मैं उसी कोड का उपयोग करता हूं तो मैं समाप्त होता हूं कुछ पूरी तरह से अलग है। – btype