非对称加密需要两把钥匙:公钥和秘钥。

单向加密:一般情况下服务器会持有秘钥和公钥,那该怎么使用呢?以注册场景为例,最初服务器持有公钥和密钥。

用户注册时不是直接发送用户名,密码,验证码等明文信息给服务器请求注册。而是先发送一个注册请求,服务器会把公钥返回给客户端,服务器返回的公钥一般是一个base64编码的字符串。客户端会把密码信息用这个公钥加密,得到一个密文,之后再将“用户名”+“密码的密文”+“验证码”之类的信息发送给服务器,服务器收到请求,将得到的密码密文解密,得到铭文密文+用户名+验证码,验证以后返回给客户端是否注册成功。

下面先说一下如何生成公钥和密钥。

MAC自带了openssl工具,我们可以很容易生成公钥密钥:生成步骤

1、打开终端,输入
openssl 2、生成一个长度为 1024字节的密钥
$  genrsa -out private_key.pem 1024
解释:genrsa : generate RAS 的缩写,指定生成秘钥的方法为RSA
-out 后面是输出的密钥文件名
1024表示生成秘钥的长度 1024 bityes
3、根据秘钥请求一个整数,可以拿着这个整数去证书颁发机构(CA)申请一个数字证书,CA会给你一个新的cacert.pem,那才是你的数字证书。
req -new -key private_key.pem -out rsaCertReq.csr

4、生成整数并签名,有效期10年
$ x509 -req -days 3650 -in rsaCertReq.csr -signkey private_key.pem -out rsaCert.crt
解释:
509是一种通用的证书格式
将用上面生成的秘钥 private_key.pem 和 rsaCert.crt 证书请求文件生成一个数字证书 rsacert.crt。这个就是公钥
5、格式转换,将PEM格式文件转成 DER格式:(供ios端测试用)
$ x509 -outform der -in rsaCert.crt -out public_key.der
解释:
在ios开发当中,公钥是不能使用 base64编码的,上面的命令是把公钥的base64编码字符串装换为二进制数据 6、ios开发当中,私钥不能直接使用,需要导出一个p12文件(private_key.p12):(供ios端测试用)
$ pkcs12 -export -out private_key.p12 -inkey private_key.pem -in rsaCert.crt

7、用私钥 生成 可供后台使用的公钥rsa_public_key.pem
$ rsa -in private_key.pem -out rsa_public_key.pem -pubout

8、生成可供后台使用的私钥 pkcs8_private_key.pem
$ pkcs8 -topk8 -in private_key.pem -out pkcs8_private_key.pem -nocrypt
9、生成可供 java 后端使用的私钥 pkcs8_private_key.pem
$ openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform DER -nocrypt -out pkcs8_private_key.der


现在,公钥密钥都有了。

参考:

https://blog.csdn.net/Boyqicheng/article/details/51858429

写了一个Demo,可以测试RSA加密字符串的流程。加密过程是有点慢的。

https://github.com/wjwdive/RSAEncrypt.git

iOS RSA非对称加密测试流程的更多相关文章

  1. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...

  2. RSA非对称加密Java实现

    原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...

  3. ssh rsa 非对称加密 基本原理

    我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...

  4. javascript版前端页面RSA非对称加密解密

    最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...

  5. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  6. 前端js,后台python实现RSA非对称加密

    先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...

  7. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...

  8. php RSA非对称加密 的实现

    基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...

  9. RSA 非对称加密,私钥转码为pkcs8 错误总结

    RSA 非对称加密,私钥转码为pkcs8 错误总结 最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案. 该上市公司简称为A公司,我们简称为B公司.A-B两家 ...

随机推荐

  1. Golang——垃圾回收GC(2)

    1 垃圾回收中的重要概念 1.1 定义 In computer science, garbage collection (GC) is a form of automatic memory manag ...

  2. SQLServer 数据库变成单个用户后无法访问问题的解决方法

    USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQL=@SQL+'; KILL '+RTRIM(SPID) FROM ma ...

  3. [ci]jenkins-slave-ssh docker容器化-自动注入key

    jenkins server 再启动slave时候,动态的注入sshkey 只要slave有ssh+jdk即可.无需事先预置用户名密码给slave. 配置 inject ssh key 配置项目 执行 ...

  4. ⑤NuPlayer播放框架之GenericSource源码分析

    [时间:2017-01] [状态:Open] [关键词:android,nuplayer,开源播放器,播放框架,GenericSource] 0 导读 GenericSource是NuPlayer:: ...

  5. CodeCombat编程游戏

    一. 介绍 官方网站:http://cn.codecombat.com/ 项目地址:https://github.com/codecombat/codecombat CodeCombat 是一个通过玩 ...

  6. 在Thinkphp中【自动加载自定义扩展配置文件】!

    /Conf/config.php为正式的扩展文件 /Conf/verify.php为扩展的自定义配置文件 /Conf/sendmail.php为扩展的自定义配置文件 如果要自动加载 verify和se ...

  7. 【iCore4 双核心板_ARM】例程十七:USB_MSC实验——读/写U盘(大容量存储器)

    实验方法: 1.将跳线冒跳至USB_UART,通过Micro USB 线将iCore4 USB-UART接口与电脑相连. 2.打开PUTTY软件. 3.通过读U盘转接线将U盘(或者读卡器)与iCore ...

  8. Spring Security 匿名认证

    1.项目截图: 2.匿名认证配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=& ...

  9. 前端项目微金所1 - bootstrap模板,Compatible(兼容),Viewport(视口),条件注释,第三方依赖,MediaQuery媒体查询

    前端项目微金所笔记1 基础的bootstrap模板 <!DOCTYPE html> <html lang="en"> <head> <me ...

  10. Vue.js常用指令:v-bind

    一.什么是v-bind指令 v-bind指令用于响应更新HTML特性,允许将一个或多个属性动态绑定到表达式.v-bind是应用在动态属性上面的. 二.语法 v-bind语法如下: v-bind:动态属 ...