非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)
公开秘钥是公开的,私有秘钥是保密的

  • 公开秘钥的好处:
    简单 : 仅仅只是一些乘除的运算而已
    可靠 : 1.不论给出多少份明文和对应的密文,也无法根据已知的明文和密文的对应关系,破译出下一份密文
    2.N和E可以公开给任何人加密使用,但是只有掌握密钥D的人才可以解密,即使加密者自己也无法解密
    灵活 : 可以产生很多的公钥E和私钥D的组合给不同的加密者
  • 公开密钥与私有密钥是一对
    如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;
    如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密
  • 非对称加密的特点
    特点 : 算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快
    对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥,所以保证其安全性就是保证密钥的安全.
    而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了
    非对称加密_第1张图片
    非对称加密的加密和解密
  • RSA算法的实际应用
    由于RSA算法的加密解密速度要比对称算法的速度慢很多,在实际应用中,通常采取:
    (1) 数据本身的加密解密使用对称加密算法(AES/DES3)
    (2) 用RSA算法加密并传输对称算法所需的秘钥
    除此之外,RSA算法还在身份认证(或称鉴权)以及数字签名方面得到广泛的使用
  • RSA算法原理
    • 原理
找出两个“很大”的质数:P 和 Q
(1)求N = P * Q
(2)求M M是p-1和q-1的最小公倍数  M= (P – 1) * (Q – 1) 或者写成"M =lcm(p-1,q-1)"
(3)找出整数E,E与M互质,即除了1之外,没有其他公约数
(4)找出整数D,使得E*D除以M余1,即 (E * D) % M = 1
"通过以上的准备工作,可以得到 :"
(1)E是公钥,负责加密
(2)D是私钥,负责解密
(3)N负责公钥和私钥之间的联系
(4)加密算法,假定对X进行加密 : (X ^ E) % N = Y (公式解读:X的E次方对N取模等于Y)
(5)根据费尔马小定义,根据以下公式可以完成解密操作 : (Y ^ D) % N = X (公式解读: Y的D次方,对N取模等于X)
  • RSA加密小实践
(1)p = 17,q = 19 =>N = 323
(2)lcm(p-1,q-1)=>lcm(16,18)=>L= 144
(3)gcd(E,L)=1 =>E=5
(4)E乘以几可以mode L =1? D=29可以满足
(5)得到公钥为:E=5,N=323
(6)得到私钥为:D=29,N=323
(7)加密 明文的E次方 mod N = 123的5次方 mod 323 = 225(密文)
(8)解密 密文的D次方 mod N = 225的29次方 mod 323 = 123(明文)
  • openssl生成密钥命令
(1)生成强度是 512 的 RSA 私钥:$ openssl genrsa -out private.pem 512
(2)以明文输出私钥内容:$ openssl rsa -in private.pem -text -out private.txt
(3)校验私钥文件:$ openssl rsa -in private.pem -check
(4)从私钥中提取公钥:$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout
(5)以明文输出公钥内容:$ openssl rsa -in public.pem -out public.txt -pubin -pubout -text
(6)使用公钥加密小文件:$ openssl rsautl -encrypt -pubin -inkey public.pem -in msg.txt -out msg.bin
(7)使用私钥解密小文件:$ openssl rsautl -decrypt -inkey private.pem -in msg.bin -out a.txt
(8)将私钥转换成 DER 格式:$ openssl rsa -in private.pem -out private.der -outform der
(9)将公钥转换成 DER 格式:$ openssl rsa -in public.pem -out public.der -pubin -outform der
非对称加密_第2张图片
终端生成私钥

非对称加密_第3张图片
终端提取公钥&加密解密
  • 示例代码
    非对称加密_第4张图片
    生成的私钥和公钥文件

    上图中p.p12是私钥文件 rsacert.der是公钥文件,在通过非对称方式对数据进行加密前,要导入这两个文件,因为加密的时候要用到,这两个文件的生成,在数字证书中,有讲述
//程序运行后,加载公钥和私钥
-(void)viewDidLoad {
    [super viewDidLoad];
    //加载公钥(用于加密)
    [[RSACryptor sharedRSACryptor] loadPublicKey:[[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil]];

    //加载私钥(用于解密)
    [[RSACryptor sharedRSACryptor] loadPrivateKey:[[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil] password:@"123456"];
}
//点击控制器的界面的时候,实现对数据的加密和解密
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    //加密
    NSString * str = @"handsome";
    NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
    NSData * encodeData = [[RSACryptor sharedRSACryptor] encryptData:data];

    //通过Base64编码,查看加密后的内容
    NSString * str1 = [encodeData base64EncodedStringWithOptions:0];
    NSLog(@"%@",str1);

    //解密
    NSData * decodeData = [[RSACryptor sharedRSACryptor] decryptData:encodeData];
    NSString * str2 = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str2);
}

你可能感兴趣的:(非对称加密)