🧑‍🏫
liualexiang
  • Introduction
  • Azure
    • AKS Basic
    • AKS Spark
    • AZ ACR SYNC
    • Azure CMI SDWAN
    • Azure LB DeepDive
      • Azure LB DeepDive
    • Azure Service Principal Basic
    • Azure Internal VM Network Connectivity
      • Azure Internal VM Network Connectivity
    • Azure Cli Build
    • Azure Vm Memory Monitor
  • Blockchain
    • BTC
  • CRISPR
    • 使用Parallel_Cluster提升CRISPA效率
  • OpenSource
    • ElasticSearch
      • ES Get Started
      • ES Search Query
      • Kibana 可视化
      • Logstash配置
    • Ansible 基础
    • Infra As Code
      • Pulumi Get Started
      • Terraform Basic
    • ZooKeeper 基础
    • RPC与REST
    • 使用Python申请大量内存测试
    • 使用TPC_DS产生压测数据
    • Superset
      • Superset部署手册
    • 代码扫描
    • Git
      • Git Basic
      • Github Action Basic
      • Gitlab与AzureAD集成
      • Gitbook 基础教程
    • K8S
      • enter_node
      • K8s X509 Client Cert
      • K8s Basic
      • K8s Oidc
      • Docker 基础
      • helm基础
      • K8S_Secrets管理
      • 深入了解K8S
      • 混沌工程
      • Istio
      • 生态
      • CRD开发
      • k8s网络
    • Cloud_Custodian
    • Jenkins Basic
    • Nginx
    • ETCD
    • 正则
    • VictoriaMetrics
    • Kafka
  • MySQL
    • MySQL 调优
  • Linux
    • SSH Tunnel 上网
    • 内存管理
    • 在Linux系统中通过LUKS加密磁盘
    • 量子计算 Basic
    • IO多路复用
    • Iptables
    • tmux和screen
    • Systemd
    • OS 基础
    • jq基础
    • yum
    • neovim
  • Web
    • Html Css
    • Web部署
    • 缓存
  • Programming
    • 算法
      • 返回list中最大生序子序列长度
    • Python技巧
      • Python的语法糖
      • Python常用装饰器
      • AsyncIO基础
      • 自动化测试pytest
      • python中的下划线
      • 面向对象
      • Python的坑
      • Python配置文件管理
      • HTTP Stream Response
      • Python项目管理
    • 设计模式
      • 设计模式
      • 面向对象的思想
      • 编程概念
    • Go
      • Go 基础
      • Go常用功能
      • 结构体入门
    • 前端
    • Vue
    • NodeJS
  • Math
    • 多项式插值法
  • Security
    • HTTP常见攻击
    • 加密与签名
    • RSA
    • ECDSA
  • Solidity
    • Solidity基础
    • Blockchain Testnet Faucet
  • Tools
    • 视频处理ffmpeg
    • IDE配置
    • iTerm2美化
    • 密码管理
    • FRP配置
    • 工具集
由 GitBook 提供支持
在本页
  1. Security

RSA

RSA算法,是先找两个质数,然后再找出来公钥(公钥是一个质数),再基于欧几里得算法找出私钥。私钥可以是无限多的,一般用最小的。

公钥私钥计算过程

先选两个质数 p 和 q,则计算出 模数 N = p * q 欧拉函数 (p-1) * (q-1),得到 PhiN 选公钥E:需要是质数; 1 < 公钥 < PhiN; 不是PhiN的因子。公钥包含 (E,N) 算私钥D: (D * E) % PhiN = 1

这里需要注意的是:由于私钥的算法是 D * E % (p-1)(q-1) = 1,那么在E是确定的时候,D是无限多的。在我们平时使用的时候,D往往是选取最小的一个

加解密过程

明文^E % N = 密文 密文^D % N = 明文 举例: p,q = 3, 11,则 N = 33, PhiN = 20, 公钥选择为 (3, 33),私钥可以是 (7, 33),也可以是 (27, 33)。对数据 3 进行加密可以验证。 公钥加密 pow(3, 3, 33) = 27 私钥解密 pow(27, 7, 33) = 3 或者 pow(27, 27, 33) = 3

但是由于N太小,容易出现数据折叠 (模数太小引起的碰撞),比如数据为 100 的时候,公钥加密为 1,私钥解密为 pow(1, 7, 33) = 1 ,解密的数据不对。 公钥的公共指数 E 为 65537,即 2 ** 16 + 1, 是因为 65537 是一个费马素数,在快速模幂计算中效率很高。而且已经形成一个行业标准(hamming weight 与指数运算的效率)。

RSA 算法的密钥长度至少为12为,下面以2048为例(以前有用1024位,现在认为不安全,建议2048或者4096位)。注意:密钥长度指的是模数 N 的长度,而并非D 的长度


func main() {  
    prikey, _ := rsa.GenerateKey(rand.Reader, 2048)  
  
    // 明文^E % N = 密文  
    // public key  
    n := prikey.N  
    e := prikey.E  
  
    // 密文 ^ D % N = 明文  
    //private key  
    d := prikey.D  
  
    fmt.Printf("质数相乘的 N is: %d\n, 公钥 E is %d, 私钥 D is: %d", n, e, d)  

    }

RSA 签名原理

RSA的签名,本质上,就是先对消息进行一次 Hash,如SHA 256,然后使用私钥对这个 SHA 256 进行加密。加密后的数据就是签名。 之后发送方将签名和原始数据一起发给对端,对端算出SHA256的值,之后用公钥对这个签名进行解密,解密后就是原始消息的SHA256的值。 用这个方法,来保障数据传输过程中没有被篡改,消息确实是由私钥持有者发出的。 由此来看,RSA在做签名确认的时候,是需要有原始消息,以及加密过的SHA256的值(即签名)的。

从这个过程来看,能做加解密的算法,可以用来做签名,比如RSA。但是能做签名的算法,不能做加解密,比如 ECDSA

上一页加密与签名下一页ECDSA

最后更新于6个月前