RSA-Algorithm
RSA算法演示程序,仅供了解RSA算法实现原理
RSA算法原理
- 找出两个"很大"的质数:P & QN = P * QM = (P - 1) * (Q - 1)找出整数E,E与M互质,即除了1之外,没有其他公约数找出整数D,使得E*D除以M余1,即 (E * D) % M = 1
- E是公钥,负责加密D是私钥,负责解密N负责公钥和私钥之间的联系加密算法,假定对X进行加密
- (X ^ E) % N = Y
- (Y ^ D) % N = X
- 简单 就是一些乘除而已可靠 可以保证产生的密文是统计独立,并且分布均匀的,也就是说:
- 不论给出多少份明文和对应的密文,也无法根据已知的明文和密文的对应关系,破译出下一份密文N和E可以公开给任何人加密使用,但是只有掌握密钥D的人才可以解密,即使加密者自己也无法解密
测试数据说明
[pre]P = 11;Q = 13;N = 143;M = 120;E = 89;D = 209;[/pre]
提示:本示例程序仅用于演示,N的数值只有143,能够加密的字符范围有限。
致谢
本示例程序的思想,参照吴军博士的《数学之美》一书,在此表示感谢!
原文地址: https://github.com/liufan321/RSA-Algorithm#rsa-algorithm
// // RSA.h // RSA原理 // #import <Foundation/Foundation.h> @interface RSA : NSObject - (NSString *)encryptString:(NSString *)string; - (NSString *)decryptString:(NSString *)string; @end
// // RSA.m // RSA原理 // #import "RSA.h" @implementation RSA static int P = 11; static int Q = 13; static int N; static int M; static int E; static int D; - (instancetype)init { self = [super init]; if (self) { N = P * Q; M = (P - 1) * (Q - 1); NSLog(@"N:%zd - M:%zd", N, M); E = 89; for (int i = 1; i < INT_MAX; i++) { if ((i * E) % M == 1 && (i != E)) { D = i; break; } } NSLog(@"E:%zd - D:%zd", E, D); } return self; } - (NSString *)encryptString:(NSString *)string { // 1. 将字符串转换成NSData NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"要加密的二进制数据: %@", data); NSMutableString *strM = [NSMutableString string]; // 2. 取出字符串中的每一个字符 for (int i = 0; i < data.length; i++) { char c = 0; [data getBytes:&c range:NSMakeRange(i, 1)]; int result = 1; // 3. (c ^ E) % N,为了防止溢出,采用循环取模的方式计算 for (int k = 0; k < E; k++) { result = result * c % N; } printf("%02d ", result); // 4. 拼接加密字符串 [strM appendFormat:@"%c", result]; } printf(" "); return [strM copy]; } - (NSString *)decryptString:(NSString *)string { // 1. 将字符串转换成NSData NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"要解密的二进制数据: %@", data); NSMutableString *strM = [NSMutableString string]; // 2. 取出字符串中的每一个字符 for (int i = 0; i < data.length; i++) { char c = 0; [data getBytes:&c range:NSMakeRange(i, 1)]; int result = 1; // 3. (c ^ D) % N,为了防止溢出,采用循环取模的方式计算 for (int k = 0; k < D; k++) { result = result * c % N; } // 4. 拼接加密字符串 [strM appendFormat:@"%c", result]; } printf(" "); return [strM copy]; } /** 判断一个数字是否为质数 */ + (BOOL)isPrime:(int)n { if (n == 0 || n == 1 ) { return NO; } int k = (int)sqrt(n); int i = 2; for (; i <= k; i++) { if (n % i == 0) break; } return (i > k); } @end
// // ViewController.h // RSA原理 // #import <UIKit/UIKit.h> @interface ViewController : UIViewController @end
// // ViewController.m // RSA原理 // // #import "ViewController.h" #import "RSA.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; RSA *rsa = [[RSA alloc] init]; NSString *encryStr = [rsa encryptString:@"Hello - Rsa"]; NSLog(@"加密结果 : %@", encryStr); NSString *decryStr = [rsa decryptString:encryStr]; NSLog(@"解密结果 : %@", decryStr); } @end