非对称加密算法

介绍

  • 非对称加密算法需要两个密钥:公开密钥(publickey) 和 私有密钥(privatekey)
  • 公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密

特点

  • 算法强度复杂、安全性依赖于算法与密钥
  • 加密解密速度慢

与对称加密算法的对比

  • 对称加密只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥
  • 非对称密钥体制有两种密钥,其中一个是公开的

RSA 算法原理

  1. 找出两个“很大”的质数:P & Q
    • N = P * Q
    • M = (P – 1) * (Q – 1)
  2. 找出整数E,E与M互质,即除了1之外,没有其他公约数
  3. 找出整数D,使得 ED 除以 M 余 1,即 (E D) % M = 1
  4. 经过上述准备工作之后,可以得到:
    • E是公钥,负责加密
    • D是私钥,负责解密
    • N负责公钥和私钥之间的联系
  5. 加密算法,假定对X进行加密
    • (X ^ E) % N = Y
  6. 解密算法,根据费尔马小定义,可以使用以下公式完成解密
    • (Y ^ D) % N = X

代码演练

CryptorTools *tools = [[CryptorTools alloc] init];

// 1. 加载公钥

NSString *pubPath = [[NSBundle mainBundle] pathForResource:@"rsacert.der" ofType:nil];

[tools loadPublicKeyWithFilePath:pubPath];

// 2. 使用公钥加密,加密内容最大长度 117

NSString *result = [tools RSAEncryptString:@"abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghi"];

NSLog(@"RSA 加密 %@", result);

// 3. 加载私钥,并指定导出 p12 时设置的密码

NSString *privatePath = [[NSBundle mainBundle] pathForResource:@"p.p12" ofType:nil];

[tools loadPrivateKey:privatePath password:@"123"];

// 4. 使用私钥解密

NSLog(@"解密结果 %@", [tools RSADecryptString:result]);

iOS 相关函数


函数


说明


SecKeyEncrypt


使用公钥对数据加密


SecKeyDecrypt


使用私钥对数据解密


SecKeyRawVerify


使用公钥对数字签名进行验证


SecKeyRawSign


使用私钥生成数字签名

应用场景

由于 RSA 算法的加密解密速度要比对称算法的速度慢很多,在实际应用中,通常采取:

  • 数据本身的加密解密使用对称加密算法(AES)
  • 用 RSA 算法加密并传输对称算法所需的密钥

OpenSSL 终端测试命令

程序开发证书生成

# 生成私钥

$ openssl genrsa -out private.pem 1024

# 创建证书请求

$ openssl req -new -key private.pem -out rsacert.csr

# 生成证书并签名,有效期10年

$ openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt

# 转换格式-将 PEM 格式文件转换成 DER 格式

$ openssl x509 -outform der -in rsacert.crt -out rsacert.der

# 导出P12文件

$ openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt

在苹果开发中,不能直接使用 PEM 格式的证书

  • DER 文件是 CRT 文件的 BASE 64 解码前的二进制数据文件
  • OpenSSL 默认生成的都是 PEM 格式的证书(BASE64 编码后的文本文件)

数字签名

  • 发送方
    • 报文 HASH 得到 报文摘要
    • 报文摘要 用公钥加密(数字签名) + 报文
    • 发送给接收方
  • 接收方
    • 报文 HASH 得到 报文摘要
    • 数字签名 用私钥解密 判断是否与 报文摘要 相同

OpenSSL 生成密钥演练

私钥 & 公钥

# 生成强度是 512 的 RSA 私钥

$ openssl genrsa -out private.pem 512

# 以明文输出私钥内容

$ openssl rsa -in private.pem -text -out private.txt

# 校验私钥文件

$ openssl rsa -in private.pem -check

# 从私钥中提取公钥

$ openssl rsa -in private.pem -out public.pem -outform PEM -pubout

# 以明文输出公钥内容

$ openssl rsa -in public.pem -out public.txt -pubin -pubout -text

加密 & 解密

# 使用公钥加密小文件

$ openssl rsautl -encrypt -pubin -inkey public.pem -in msg.txt -out msg.bin

# 使用私钥解密小文件

$ openssl rsautl -decrypt -inkey private.pem -in msg.bin -out a.txt

格式转换

# 将私钥转换成 DER 格式

$ openssl rsa -in private.pem -out private.der -outform der

# 将公钥转换成 DER 格式

$ openssl rsa -in public.pem -out public.der -pubin -outform der

PKCS

  • Public-Key Cryptography Standards (PKCS)是由美国 RSA 数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议

PKCS协议


协议


说明


PKCS#1


定义 RSA 公开密钥算法加密和签名机制,主要用于组织 PKCS#7 中所描述的数字签名和数字信封(专门用来加密/解密)


PKCS#8


描述私有密钥信息格式,该信息包括公开密钥算法的私有密钥以及可选的属性集等(JAVA使用)


PKCS#12


描述个人信息交换语法标准。描述了将用户公钥、私钥、证书和其他相关信息打包的语法(苹果使用)

时间: 2024-10-12 10:20:08

非对称加密算法的相关文章

openssl 非对称加密算法RSA命令详解

1.非对称加密算法概述 非对称加密算法也称公开密钥算法,其解决了对称加密算法密钥分配的问题,非对称加密算法基本特点如下: 1.加密密钥和解密密钥不同 2.密钥对中的一个密钥可以公开 3.根据公开密钥很难推算出私人密钥 根据非对称加密算法的特点,可用户数字签名.密钥交换.数据加密.但是由于非对称加密算法较对称加密算法加密速度慢很多,故最常用的用途是数字签名和密钥交换. 目前常用的非对称加密算法有RSA, DH和DSA三种,但并非都可以用于密钥交换和数字签名.而是RSA可用于数字签名和密钥交换,DH

Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

[前言] 本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及用法和样例 [最简单的加密] 1.简单的概念 明文:加密前的信息 密文:机密后的信息 算法:加密或解密的算法 密钥:算法使用的钥匙(读作miyao.正确应该是miyue,可是大家都读miyao) 2.简单的样例 将123456每位数字都加1后得到234567, 当中123456就是明文.234567就是密文.加密密钥就是1,加密算法是每位加 3.对称加密和非对称加密 以上为例. 123456-->234567的加密

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

非对称加密算法RSA--转

RSA     这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman.     这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥.相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了.RSA同时有两把钥匙,公钥与私钥.同时支持数字签名.数字签名的意义在于,对传输过来的数据进行校验.确保数据在传输工程中不被修改. 流程分

第十二章 非对称加密算法-RSA

注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第8章“高等加密算法--非对称加密算法” 12.1.RSA(最经典的非对称加密算法) 特点: 使用一套密钥即可完成加解密(与DH不同) 与DH不同的第二点是,RSA自己可以完成加解密,而DH需要依赖于对称加密算法 “私钥加密,公钥解密”或“公钥加密,私钥解密” 公钥长度远小于私钥长度(对下边的代码进行测试,自己比较结果) 加解密流程: 1)发送方(假设为甲方)构建密钥对,自己保留私钥,将公钥发送给接收方(假设为乙方) 2)甲方使用密

对称加密算法和非对称加密算法速度对比

测试环境: CPU 1 核 Intel 2.2GHZ 内存 1GB 算法 种类 对称加密算法 AES CBC 模式 非对称加密算法 RSA 256 加密明文长度为160 bytes 各运行10000次 上代码 test_aes.py from Crypto.Cipher import AES import time obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456') message = 'a' * 160 t1

信息加密之非对称加密算法RSA

前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码,相对于DH算法,RSA显得有些简单.初始化密钥: KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512); KeyPair keyPa

Java加密技术(四)非对称加密算法RSA

RSA  这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman. 这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥.相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了.RSA同时有两把钥匙,公钥与私钥.同时支持数字签名.数字签名的意义在于,对传输过来的数据进行校验.确保数据在传输工程中不被修改. 流程分析: 甲方构建

JAVA 非对称加密算法RSA

非对称加密算法 RSA过程 : 以甲乙双方为例 1.初始化密钥 构建密钥对,生成公钥.私钥保存到keymap中 KeyPairGenerator ---> KeyPair --> RSAPublicKey.RSAPrivateKey 2.甲方使用私钥加密, 加密后在用私钥对加密数据进行数据签名,然后发送给乙方 RSACoder.encryptByPrivateKey(data, privateKey); RSACoder.sign(encodedData, privateKey); 3.乙方则