目标C中的RSA实现 [英] RSA implementations in Objective C
问题描述
我正在使用目标C中使用 RSA算法
的简单应用程序。我想使用它在服务器/客户端通信。我需要在iOS / iPhone中的RSA算法实现中的帮助。
- 我知道加密和解密。
- 我必须通过
CommonCryptor.h
。 / li>
我已经尝试过NSString的RSA加密和解密。以下是代码:
将Security.Framework添加到项目包中。
ViewController.h 代码如下:
#import< UIKit / UIKit.h>
#import< Security / Security.h>
@interface ViewController:UIViewController
{
SecKeyRef publicKey;
SecKeyRef privateKey;
NSData * publicTag;
NSData * privateTag;
}
- (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer;
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer;
- (SecKeyRef)getPublicKeyRef;
- (SecKeyRef)getPrivateKeyRef;
- (void)testAsymmetricEncryptionAndDecryption;
- (void)generateKeyPair:(NSUInteger)keySize;
@end
ViewController.m 文件代码如下
#importViewController.h
const size_t BUFFER_SIZE = 64;
const size_t CIPHER_BUFFER_SIZE = 1024;
const uint32_t PADDING = kSecPaddingNone;
static const UInt8 publicKeyIdentifier [] =com.apple.sample.publickey;
static const UInt8 privateKeyIdentifier [] =com.apple.sample.privatekey;
@implementation ViewController
- (SecKeyRef)getPublicKeyRef {
OSStatus sanityCheck = noErr;
SecKeyRef publicKeyReference = NULL;
if(publicKeyReference == NULL){
[self generateKeyPair:512];
NSMutableDictionary * queryPublicKey = [[NSMutableDictionary alloc] init];
//设置公钥查询字典。
[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];
//获取密钥。
sanityCheck = SecItemCopyMatching((__ bridge CFDictionaryRef)queryPublicKey,(CFTypeRef *)& publicKeyReference);
if(sanityCheck!= noErr)
{
publicKeyReference = NULL;
}
// [queryPublicKey release];
} else {publicKeyReference = publicKey; }
return publicKeyReference; }
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
//发布任何未使用的缓存数据,图像等。
}
- (void)testAsymmetricEncryptionAndDecryption {
uint8_t * plainBuffer;
uint8_t * cipherBuffer;
uint8_t * decryptptedBuffer;
const char inputString [] =这是Objective C中的RSA实现的测试演示;
int len = strlen(inputString);
// TODO:这是一个黑客,因为我知道inputString的长度将小于BUFFER_SIZE
if(len> BUFFER_SIZE)len = BUFFER_SIZE-1;
plainBuffer =(uint8_t *)calloc(BUFFER_SIZE,sizeof(uint8_t));
cipherBuffer =(uint8_t *)calloc(CIPHER_BUFFER_SIZE,sizeof(uint8_t));
decryptptedBuffer =(uint8_t *)calloc(BUFFER_SIZE,sizeof(uint8_t));
strncpy((char *)plainBuffer,inputString,len);
NSLog(@init()plainBuffer:%s,plainBuffer);
// NSLog(@init():sizeof(plainBuffer):%d,sizeof(plainBuffer));
[self encryptWithPublicKey:(UInt8 *)plainBuffer cipherBuffer:cipherBuffer];
NSLog(@加密数据:%s,cipherBuffer);
// NSLog(@init():sizeof(cipherBuffer):%d,sizeof(cipherBuffer));
[self decryptWithPrivateKey:cipherBuffer plainBuffer:decryptptedBuffer];
NSLog(@decryptpted data:%s,decryptptedBuffer);
// NSLog(@init():sizeof(decryptptedBuffer):%d,sizeof(decryptptedBuffer));
NSLog(@====== / second test ============================= ==);
free(plainBuffer);
free(cipherBuffer);
free(decryptptedBuffer);
}
/ *借用:
* https://developer.apple.com/library/mac/#documentation/security/conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks。 html
* /
- (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer
{
NSLog(@== encryptWithPublicKey ));
OSStatus status = noErr;
NSLog(@**原始纯文本0:%s,plainBuffer);
size_t plainBufferSize = strlen((char *)plainBuffer);
size_t cipherBufferSize = CIPHER_BUFFER_SIZE;
NSLog(@SecKeyGetBlockSize()public =%lu,SecKeyGetBlockSize([self getPublicKeyRef]));
//处理错误
//使用public加密。
status = SecKeyEncrypt([self getPublicKeyRef],
PADDING,
plainBuffer,
plainBufferSize,
& cipherBuffer [0],
& cipherBufferSize
);
NSLog(@加密结果代码:%ld(size:%lu),status,cipherBufferSize);
NSLog(@加密文本:%s,cipherBuffer);
}
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer
{
OSStatus status = noErr;
size_t cipherBufferSize = strlen((char *)cipherBuffer);
NSLog(@decryptWithPrivateKey:缓冲区长度:%lu,BUFFER_SIZE);
NSLog(@decryptWithPrivateKey:input of input:%lu,cipherBufferSize);
// DECRYPTION
size_t plainBufferSize = BUFFER_SIZE;
//处理错误
status = SecKeyDecrypt([self getPrivateKeyRef],
PADDING,
& cipherBuffer [0],
cipherBufferSize,
& plainBuffer [0],
& plainBufferSize
);
NSLog(@解密结果代码:%ld(size:%lu),status,plainBufferSize);
NSLog(@FINAL decryptiled text:%s,plainBuffer);
}
- (SecKeyRef)getPrivateKeyRef {
OSStatus resultCode = noErr;
SecKeyRef privateKeyReference = NULL;
// NSData * privateTag = [NSData dataWithBytes:@ABCDlength:strlen((const char *)@ABCD)];
// if(privateKey == NULL){
[self generateKeyPair:512];
NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init];
//设置私钥查询字典。
[queryPrivateKey setObject:(__ bridge id)kSecClassKey forKey:(__ bridge id)kSecClass];
[queryPrivateKey setObject:privateTag forKey:(__ bridge id)kSecAttrApplicationTag];
[queryPrivateKey setObject:(__ bridge id)kSecAttrKeyTypeRSA forKey:(__ bridge id)kSecAttrKeyType];
[queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(__ bridge id)kSecReturnRef];
//获取密钥。
resultCode = SecItemCopyMatching((__ bridge CFDictionaryRef)queryPrivateKey,(CFTypeRef *)& privateKeyReference);
NSLog(@getPrivateKey:result code:%ld,resultCode);
if(resultCode!= noErr)
{
privateKeyReference = NULL;
}
// [queryPrivateKey release];
//} else {
// privateKeyReference = privateKey;
//}
return privateKeyReference;
}
#pragma mark - 查看生命周期
- (void)viewDidLoad
{
[super viewDidLoad];
//加载视图后,通常从笔尖进行任何其他设置。
}
- (void)viewDidUnload
{
[super viewDidUnload];
//发布主视图的任何保留的子视图。
//例如self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)动画
{
[super viewWillAppear:animated];
privateTag = [[NSData alloc] initWithBytes:privateKeyIdentifier length:sizeof(privateKeyIdentifier)];
publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];
[self testAsymmetricEncryptionAndDecryption];
}
- (void)viewDidAppear:(BOOL)动画
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)动画
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)动画
{
[super viewDidDisappear:animated];
- (BOOL)shouldAutorotateToInterfaceOrientation :( UIInterfaceOrientation)interfaceOrientation
{
//为支持的方向返回YES
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
return(interfaceOrientation!= UIInterfaceOrientationPortraitUpsideDown);
} else {
return YES;
}
}
- (void)generateKeyPair:(NSUInteger)keySize {
OSStatus sanityCheck = noErr;
publicKey = NULL;
privateKey = NULL;
// LOGGING_FACILITY1(keySize == 512 || keySize == 1024 || keySize == 2048,@%d是无效且不受支持的键大小,keySize);
//首先删除当前密钥。
// [self deleteAsymmetricKeys];
//容器字典。
NSMutableDictionary * privateKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary * publicKeyAttr = [[NSMutableDictionary alloc] init];
NSMutableDictionary * keyPairAttr = [[NSMutableDictionary alloc] init];
//设置关键字的顶级字典。
[keyPairAttr setObject:(__ bridge id)kSecAttrKeyTypeRSA forKey:(__ bridge id)kSecAttrKeyType];
[keyPairAttr setObject:[NSNumber numberWithUnsignedInteger:keySize] forKey:(__ bridge id)kSecAttrKeySizeInBits];
//设置私钥字典。
[privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__ bridge id)kSecAttrIsPermanent];
[privateKeyAttr setObject:privateTag forKey:(__ bridge id)kSecAttrApplicationTag];
//请参阅SecKey.h设置其他标志值。
//设置公钥字典。
[publicKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__ bridge id)kSecAttrIsPermanent];
[publicKeyAttr setObject:publicTag forKey:(__ bridge id)kSecAttrApplicationTag];
//请参阅SecKey.h设置其他标志值。
//将属性设置为顶级字典。
[keyPairAttr setObject:privateKeyAttr forKey:(__ bridge id)kSecPrivateKeyAttrs];
[keyPairAttr setObject:publicKeyAttr forKey:(__ bridge id)kSecPublicKeyAttrs];
// SecKeyGeneratePair仅用于教育目的返回SecKeyRefs。
sanityCheck = SecKeyGeneratePair((__ bridge CFDictionaryRef)keyPairAttr,& publicKey和& privateKey);
// LOGGING_FACILITY(sanityCheck == noErr&& publicKey!= NULL&&& publicKey!= NULL,@生成密钥对时真的很糟糕。
if(sanityCheck == noErr&& publicKey!= NULL&& privateKey!= NULL)
{
NSLog(@Successful);
}
// [privateKeyAttr release];
// [publicKeyAttr release];
// [keyPairAttr release];
}
@end
我最初发布了我的答案: Iphone - 如何用公钥加密NSData并用私钥解密?
如果您需要更多帮助,请通知我。 p>
希望这有帮助。
I am working on a simple app in objective-C that uses RSA Algorithm
. I want to use it on Server/Client Communications. I need help in RSA Algorithm Implementation in iOS/iPhone.
- I have knowledge of encryption and decryption.
- I want an opensource library or code to add into my project.
- I have to go though
CommonCryptor.h
.
I have tried RSA Encryption and Decryption for NSString. Here is the code:
Add Security.Framework to your project bundle.
ViewController.h code is as follows:
#import <UIKit/UIKit.h>
#import <Security/Security.h>
@interface ViewController : UIViewController
{
SecKeyRef publicKey;
SecKeyRef privateKey;
NSData *publicTag;
NSData *privateTag;
}
- (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer;
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer;
- (SecKeyRef)getPublicKeyRef;
- (SecKeyRef)getPrivateKeyRef;
- (void)testAsymmetricEncryptionAndDecryption;
- (void)generateKeyPair:(NSUInteger)keySize;
@end
ViewController.m file code is as follows:
#import "ViewController.h"
const size_t BUFFER_SIZE = 64;
const size_t CIPHER_BUFFER_SIZE = 1024;
const uint32_t PADDING = kSecPaddingNone;
static const UInt8 publicKeyIdentifier[] = "com.apple.sample.publickey";
static const UInt8 privateKeyIdentifier[] = "com.apple.sample.privatekey";
@implementation ViewController
-(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)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
- (void)testAsymmetricEncryptionAndDecryption {
uint8_t *plainBuffer;
uint8_t *cipherBuffer;
uint8_t *decryptedBuffer;
const char inputString[] = "This is a test demo for RSA Implementation in Objective C";
int len = strlen(inputString);
// TODO: this is a hack since i know inputString length will be less than BUFFER_SIZE
if (len > BUFFER_SIZE) len = BUFFER_SIZE-1;
plainBuffer = (uint8_t *)calloc(BUFFER_SIZE, sizeof(uint8_t));
cipherBuffer = (uint8_t *)calloc(CIPHER_BUFFER_SIZE, sizeof(uint8_t));
decryptedBuffer = (uint8_t *)calloc(BUFFER_SIZE, sizeof(uint8_t));
strncpy( (char *)plainBuffer, inputString, len);
NSLog(@"init() plainBuffer: %s", plainBuffer);
//NSLog(@"init(): sizeof(plainBuffer): %d", sizeof(plainBuffer));
[self encryptWithPublicKey:(UInt8 *)plainBuffer cipherBuffer:cipherBuffer];
NSLog(@"encrypted data: %s", cipherBuffer);
//NSLog(@"init(): sizeof(cipherBuffer): %d", sizeof(cipherBuffer));
[self decryptWithPrivateKey:cipherBuffer plainBuffer:decryptedBuffer];
NSLog(@"decrypted data: %s", decryptedBuffer);
//NSLog(@"init(): sizeof(decryptedBuffer): %d", sizeof(decryptedBuffer));
NSLog(@"====== /second test =======================================");
free(plainBuffer);
free(cipherBuffer);
free(decryptedBuffer);
}
/* Borrowed from:
* https://developer.apple.com/library/mac/#documentation/security/conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html
*/
- (void)encryptWithPublicKey:(uint8_t *)plainBuffer cipherBuffer:(uint8_t *)cipherBuffer
{
NSLog(@"== encryptWithPublicKey()");
OSStatus status = noErr;
NSLog(@"** original plain text 0: %s", plainBuffer);
size_t plainBufferSize = strlen((char *)plainBuffer);
size_t cipherBufferSize = CIPHER_BUFFER_SIZE;
NSLog(@"SecKeyGetBlockSize() public = %lu", SecKeyGetBlockSize([self getPublicKeyRef]));
// Error handling
// Encrypt using the public.
status = SecKeyEncrypt([self getPublicKeyRef],
PADDING,
plainBuffer,
plainBufferSize,
&cipherBuffer[0],
&cipherBufferSize
);
NSLog(@"encryption result code: %ld (size: %lu)", status, cipherBufferSize);
NSLog(@"encrypted text: %s", cipherBuffer);
}
- (void)decryptWithPrivateKey:(uint8_t *)cipherBuffer plainBuffer:(uint8_t *)plainBuffer
{
OSStatus status = noErr;
size_t cipherBufferSize = strlen((char *)cipherBuffer);
NSLog(@"decryptWithPrivateKey: length of buffer: %lu", BUFFER_SIZE);
NSLog(@"decryptWithPrivateKey: length of input: %lu", cipherBufferSize);
// DECRYPTION
size_t plainBufferSize = BUFFER_SIZE;
// Error handling
status = SecKeyDecrypt([self getPrivateKeyRef],
PADDING,
&cipherBuffer[0],
cipherBufferSize,
&plainBuffer[0],
&plainBufferSize
);
NSLog(@"decryption result code: %ld (size: %lu)", status, plainBufferSize);
NSLog(@"FINAL decrypted text: %s", plainBuffer);
}
- (SecKeyRef)getPrivateKeyRef {
OSStatus resultCode = noErr;
SecKeyRef privateKeyReference = NULL;
// NSData *privateTag = [NSData dataWithBytes:@"ABCD" length:strlen((const char *)@"ABCD")];
// if(privateKey == NULL) {
[self generateKeyPair:512];
NSMutableDictionary * queryPrivateKey = [[NSMutableDictionary alloc] init];
// Set the private key query dictionary.
[queryPrivateKey setObject:(__bridge id)kSecClassKey forKey:(__bridge id)kSecClass];
[queryPrivateKey setObject:privateTag forKey:(__bridge id)kSecAttrApplicationTag];
[queryPrivateKey setObject:(__bridge id)kSecAttrKeyTypeRSA forKey:(__bridge id)kSecAttrKeyType];
[queryPrivateKey setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef];
// Get the key.
resultCode = SecItemCopyMatching((__bridge CFDictionaryRef)queryPrivateKey, (CFTypeRef *)&privateKeyReference);
NSLog(@"getPrivateKey: result code: %ld", resultCode);
if(resultCode != noErr)
{
privateKeyReference = NULL;
}
// [queryPrivateKey release];
// } else {
// privateKeyReference = privateKey;
// }
return privateKeyReference;
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
privateTag = [[NSData alloc] initWithBytes:privateKeyIdentifier length:sizeof(privateKeyIdentifier)];
publicTag = [[NSData alloc] initWithBytes:publicKeyIdentifier length:sizeof(publicKeyIdentifier)];
[self testAsymmetricEncryptionAndDecryption];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
} else {
return YES;
}
}
- (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 private key dictionary.
[privateKeyAttr setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecAttrIsPermanent];
[privateKeyAttr setObject:privateTag forKey:(__bridge id)kSecAttrApplicationTag];
// See SecKey.h to set other flag values.
// 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:privateKeyAttr forKey:(__bridge id)kSecPrivateKeyAttrs];
[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];
}
@end
Here is where I originally posted my answer : Iphone - How to encrypt NSData with public key and decrypt with private key?
Let me know if you need more help.
Hope this helps.
这篇关于目标C中的RSA实现的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!