openssl3des加密
① openssl 3des 线程安全吗
3DES需要的输入明文长度、密文长度都是8的整数倍
② 关于openssl AES/ECB/PKCS5Padding加密 求助
3DES需要的输入明文长度、密文长度都是8的整数倍。
而CBC.CFB都需要初始化向量的参数才能加密、解密、。
③ 开发中常见的加密方式及应用
开发中常见的加密方式及应用
一、base64
简述:Base64是网络上最常见的用于传输8Bit 字节码 的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。所有的数据都能被编码为并只用65个字符就能表示的文本文件。( 65字符:A~Z a~z 0~9 + / = )编码后的数据~=编码前数据的4/3,会大1/3左右(图片转化为base64格式会比原图大一些)。
应用:Base64编码是从二进制到字符的过程,可用于在 HTTP 环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一 标识符 (一般为128-bit的UUID)编码为一个字符串,用作HTTP 表单 和HTTP GET URL中的参数。在其他应用程序中,也常常需要把二进制 数据编码 为适合放在URL(包括隐藏 表单域 )中的形式。此时,采用Base64编码具有不可读性,需要解码后才能阅读。
命令行进行Base64编码和解码
编码:base64 123.png -o 123.txt
解码:base64 123.txt -o test.png -D Base64编码的原理
原理:
1)将所有字符转化为ASCII码;
2)将ASCII码转化为8位二进制;
3)将二进制3个归成一组(不足3个在后边补0)共24位,再拆分成4组,每组6位;
4)统一在6位二进制前补两个0凑足8位;
5)将补0后的二进制转为十进制;
6)从Base64编码表获取十进制对应的Base64编码;
Base64编码的说明:
a.转换的时候,将三个byte的数据,先后放入一个24bit的缓冲区中,先来的byte占高位。
b.数据不足3byte的话,于缓冲区中剩下的bit用0补足。然后,每次取出6个bit,按照其值选择查表选择对应的字符作为编码后的输出。
c.不断进行,直到全部输入数据转换完成。
d.如果最后剩下两个输入数据,在编码结果后加1个“=”;
e.如果最后剩下一个输入数据,编码结果后加2个“=”;
f.如果没有剩下任何数据,就什么都不要加,这样才可以保证资料还原的正确性。
二、HASH加密/单向散列函数
简述:Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度(32个字符)的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。对用相同数据,加密之后的密文相同。 常见的Hash算法有MD5和SHA。由于加密结果固定,所以基本上原始的哈希加密已经不再安全,于是衍生出了加盐的方式。加盐:先对原始数据拼接固定的字符串再进行MD5加密。
特点:
1) 加密 后密文的长度是定长(32个字符的密文)的
2)如果明文不一样,那么散列后的结果一定不一样
3)如果明文一样,那么加密后的密文一定一样(对相同数据加密,加密后的密文一样)
4)所有的加密算法是公开的
5)不可以逆推反算(不能根据密文推算出明文),但是可以暴力 破解 ,碰撞监测
原理:MD5消息摘要算法,属Hash算法一类。MD5算法对输入任意长度的消息进行运行,产生一个128位的消息摘要。
1)数据填充
对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。
填充方法:在消息后面进行填充,填充第一位为1,其余为0。
2)添加信息长度
在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对264取模)。
在此步骤进行完毕后,最终消息长度就是512的整数倍。
3)数据处理
准备需要用到的数据:
4个常数:A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;
4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z);G(X,Y,Z)=(X & Z) | (Y & (~Z));H(X,Y,Z)=X ^ Y ^ Z;I(X,Y,Z)=Y ^ (X | (~Z));
把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。
三、对称加密
经典算法:
1)DES数据加密标准
DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。
DES算法是这样工作的:如Mode为加密,则用Key去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PIN、MAC等)在公共通信网中传输的安全性和可靠性。
2)3DES使用3个密钥,对消息进行(密钥1·加密)+(密钥2·解密)+(密钥3·加密)
3)AES高级加密标准
如图,加密/解密使用相同的密码,并且是可逆的
四、非对称加密
特点:
1)使用公钥加密,使用私钥解密
2)公钥是公开的,私钥保密
3)加密处理安全,但是性能极差
经典算法RSA:
1)RSA原理
(1)求N,准备两个质数p和q,N = p x q
(2)求L,L是p-1和q-1的最小公倍数。L = lcm(p-1,q-1)
(3)求E,E和L的最大公约数为1(E和L互质)
(4)求D,E x D mode L = 1
五、数字签名
原理以及应用场景:
1)数字签名的应用场景
需要严格验证发送方身份信息情况
2)数字签名原理
(1)客户端处理
对"消息"进行HASH得到"消息摘要"
发送方使用自己的私钥对"消息摘要"加密(数字签名)
把数字签名附着在"报文"的末尾一起发送给接收方
(2)服务端处理
对"消息" HASH得到"报文摘要"
使用公钥对"数字签名"解密
对结果进行匹配
六、数字证书
简单说明:
证书和驾照很相似,里面记有姓名、组织、地址等个人信息,以及属于此人的公钥,并有认证机构施加数字签名,只要看到公钥证书,我们就可以知道认证机构认证该公钥的确属于此人。
数字证书的内容:
1)公钥
2)认证机构的数字签名
证书的生成步骤:
1)生成私钥openssl genrsa -out private.pem 1024
2)创建证书请求openssl req -new -key private.pem -out rsacert.csr
3)生成证书并签名,有效期10年openssl x509 -req -days 3650 -in rsacert.csr -signkey private.pem -out rsacert.crt
4)将PEM格式文件转换成DER格式openssl x509 -outform der -in rsacert.crt -out rsacert.der
5)导出P12文件openssl pkcs12 -export -out p.p12 -inkey private.pem -in rsacert.crt
iOS开发中的注意点:
1)在iOS开发中,不能直接使用PEM格式的证书,因为其内部进行了Base64编码,应该使用的是DER的证书,是二进制格式的;
2)OpenSSL默认生成的都是PEM格式的证书。
七、https
HTTPS和HTTP的区别:
超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感信息,比如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议HTTPS。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下四点:
1)https协议需要到ca申请证书,一般免费证书很少,需要交费。
2)http是 超文本传输协议 ,信息是明文传输,https则是具有 安全性 的 ssl 加密传输协议。
3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的 网络协议 ,比http协议安全。
5)SSL:Secure Sockets Layer安全套接字层;用数据加密(Encryption)技术,可确保数据在网络上传输过程中不会被截取及窃听。目前一般通用之规格为40 bit之安全标准,美国则已推出128 bit之更高安全标准,但限制出境。只要3.0版本以上之I.E.或Netscape 浏览器 即可支持SSL。目前版本为3.0。SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层:SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。
④ OpenSSL 功能介绍
1 概述
OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。
OpenSSL是实现安全套接字层(SSL v2 / v3)和传输层安全(TLS v1)网络协议及其所需的相关加密标准的加密工具包。
OpenSSL:开源项目
三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss
.openssl命令:
两种运行模式:交互模式和批处理模式
opensslversion:程序版本号
标准命令、消息摘要命令、加密命令
标准命令:enc, ca, req, ...
查看帮助:openssl ?
可以通过openssl 来创建CA和颁发证书,文章 http://ghbsunny.blog.51cto.com/7759574/1964754
有做介绍,本文仅介绍openssl这个工具包的其他常用功能
2 案例介绍
2.1 对称加密
工具:openssl enc, gpg,文章 http://ghbsunny.blog.51cto.com/7759574/1964887 已经介绍
算法:3des, aes, blowfish, twofish
.enc命令:
对称密码命令允许使用基于密码或明确提供的密钥的各种块和流密码来加密或解密数据。 Base64编码或解码也可以通过本身或加密或解密来执行。
The symmetric cipher commands allow data to be encrypted or decrypted using various block and stream ciphers using keys based on passwords or explicitly provided. Base64 encoding or decoding can also be performed either by itself or in addition to the encryption or decryption.
帮助:man enc
例子
加密文件
以下命令运行需要输入一个密码,当解密的时候需要输入相同的密码才能解密,这里新生成的文件后缀名不一定是cipher,可以自己指定
openssl enc -e -des3 -a -salt -in testfile -out testfile.cipher
解密文件
openssl enc -d -des3 -a -salt –in testfile.cipher -out testfile
2.2 公钥加密
公钥加密生成非对称的密钥
算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
数字签名:
算法:RSA, DSA, ELGamal
密钥交换:
算法:dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。命名是取其名字首字母组合成RSA
RSA公钥与私钥主要用于数字签名(Digital Signature)与认证(Authentication),我们一般也称之为不对称加密/解密。
2.2.1 生成密钥对
帮助:man genrsa
.生成私钥,这个生成密钥的过程要掌握
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS
私钥文件生成后,建议把权限改成600,保护,放在被其他人查看密码信息
私钥里的文件,如果被拿到,没有通过des这关键字加密的话,就相当于是明文
这个命令执行的时候,要输入八位数的密码,当要使用这个私钥的时候需要输入密码
(umask 077; openssl genrsa –out test.key –des 2048)
括号表示子进程,结束后,umask就会恢复未默认的值,umask的值使得其他人和组都没有任何权限,是为了保护生成的私钥
2.2.2 从私钥中提取出公钥,导出公钥
公钥推不出私钥,私钥可以推出公钥
openssl rsa -in PRIVATEKEYFILE –pubout –out PUBLICKEYFILE
Openssl rsa –in test.key –pubout –out test.key.pub
公钥是公开的,可以不设置权限,以上是生成公钥
2.2.3 公钥加密文件
openssl rsautl -encrypt -in input.file -inkey pubkey.pem -pubin -out output.file
-in 指定被加密的文件
-inkey 指定加密公钥文件
-pubin 表面是用纯公钥文件加密
-out 指定加密后的文件
例子:
openssl rsautl -encrypt -in ftpback -inkey test.key.pub -pubin -out ftpssl
2.2.4 私钥解密文件
openssl rsautl -decrypt -in input.file -inkey key.pem -out output.file
-in 指定需要解密的文件
-inkey 指定私钥文件
-out 指定解密后的文件
例子:
openssl rsautl -decrypt -in ftpssl -inkey test.key -out ftpdec
2.3 单向加密
单向加密即获取摘要
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst
dgst:摘要功能输出所提供文件的消息摘要或十六进制形式的文件。 它们也可用于数字签名和验证。
The digest functions output the message digest of a supplied file or files in hexadecimal form. They can also be used for digital signing and verification.
.dgst命令:
帮助:man dgst
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
以上命令将文件生成一个固定长度的摘要值,算法是md5,大小占128bite
md5sum /PATH/TO/SOMEFILE
以上这两个md5得到的结果是一样的
.MAC: Message Authentication Code,单向加密(hash)的一种延伸应用,用于实现网络通信中保证所传输数据的完整性机制
MAC 消息认证码,构造方法可以基于hash,也可以基于对称加密算法,HMAC是基于hash的消息认证码。数据和密钥作为输入,摘要信息作为输出,常用于认证。
源文档
2.4 生成用户密码
passwd命令:
帮助:man sslpasswd
openssl passwd -1 -salt SALT
-1对应的就是hash的md5算法
SALT:这里是盐值,人为指定,使得同一密码生成的加密值不一样,最多8位,超过8位没有意义,比如前面8位一样,后面还有几位数不一样,这样生成的密码值是一样的
openssl passwd -1 –salt centos
grub-md5-crypt同样生成md5加密的口令,centos为盐值
比如这里的密码我都是输入123,但是盐值不一样,一个是centos,一个是centos6,生成的加密值不一样
2.5 生成随机数
帮助:man sslrand
rand命令在播放随机数生成器一次后输出num伪随机字节。 与其他openssl命令行工具一样,除了-rand选项中给出的文件外,PRNG种子使用文件$ HOME / .rnd或.rnd。 如果从这些来源获得足够的播种,将会写回新的$ HOME / .rnd或.rnd文件。
The rand command outputs num pseudo-random bytes after seeding the random number generator once. As in other openssl command line tools, PRNG seeding uses the file $HOME/.rnd or .rnd in addition to the files given in the -rand option. A new $HOME/.rnd or .rnd file will be written back if enough seeding was obtained from these sources.
openssl rand -base64|-hex NUM
指定数字生成随机数,如果是-hex 后面的数值比如6,那么生成的长度是12位,因为hex生成的随机数是16进制组合的数,hex 后面的num是字节数,一个16进制数占用4位,半个字节
base后面可以生成随机密码
base64 生成随机的数,可以用任何字符,也可以把图片保存成base64的格式,通过base64生成的图片,可以
用base64来还原出图片
NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出现的字符数为NUM*2
3 总结
openssl还有很多用法,本文仅单纯介绍了其中一部分,更多用法请使用帮助 man openssl 进行查看
⑤ openssl 测试加密速度,咋看呀
做为1024辅ede3中径:44443 ede3在2.93sthe数字是在上千字节每秒processed.type 1024bytesdes ede3 15575.4 求采纳 谢谢 !!
⑥ openssl 加密算法区别
openssl加密算法区别是:RSA/DSA ,不同的是RSA可以用于加/解密,也可以用于签名验签,DSA则只能用于签名。至于SHA则是一种和md5相同的算法。
它不是用于加密解密或者签名的,它被称为摘要算法。就是通过一种算法,依据数据内容生成一种固定长度的摘要,这串摘要值与原数据存在对应关系,就是原数据会生成这个摘要,但是,这个摘要是不能还原成原数据的。
正常情况下是这样的,这个算法起的作用就是,如果你把原数据修改一点点,那么生成的摘要都会不同,传输过程中把原数据给你再给你一个摘要,你把得到的原数据同样做一次摘要算法,与给你的摘要相比较就可以知道这个数据有没有在传输过程中被修改了。
openssl加密算法的实际运用:
实际应用过程中,因为需要加密的数据可能会很大,进行加密费时费力,所以一般都会把原数据先进行摘要,然后对这个摘要值进行加密,将原数据的明文和加密后的。
摘要值一起传给你。这样你解开加密后的摘要值,再和你得到的数据进行的摘要值对应一下就可以知道数据有没有被修改了。
而且,因为私钥只有你有,只有你能解密摘要值,所以别人就算把原数据做了修改,然后生成一个假的摘要给你也是不行的,你这边用密钥也根本解不开。
⑦ openssl 如何使用
为一个基于密码学的安全开发包,OpenSSL提供的功能相当强大和全面,囊括了主要的密码算法、常用的密钥和证书封装管理功能以及SSL协议,并提供了丰富的应用程序供测试或其它目的使用。
1.对称加密算法
OpenSSL一共提供了8种对称加密算法,其中7种是分组加密算法,仅有的一种流加密算法是RC4。这7种分组加密算法分别是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支持电子密码本模式(ECB)、加密分组链接模式(CBC)、加密反馈模式(CFB)和输出反馈模式(OFB)四种常用的分组密码加密模式。其中,AES使用的加密反馈模式(CFB)和输出反馈模式(OFB)分组长度是128位,其它算法使用的则是64位。事实上,DES算法里面不仅仅是常用的DES算法,还支持三个密钥和两个密钥3DES算法。
2.非对称加密算法
OpenSSL一共实现了4种非对称加密算法,包括DH算法、RSA算法、DSA算法和椭圆曲线算法(EC)。DH算法一般用户密钥交换。RSA算法既可以用于密钥交换,也可以用于数字签名,当然,如果你能够忍受其缓慢的速度,那么也可以用于数据加密。DSA算法则一般只用于数字签名。
3.信息摘要算法
OpenSSL实现了5种信息摘要算法,分别是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA算法事实上包括了SHA和SHA1两种信息摘要算法,此外,OpenSSL还实现了DSS标准中规定的两种信息摘要算法DSS和DSS1。
4.密钥和证书管理
密钥和证书管理是PKI的一个重要组成部分,OpenSSL为之提供了丰富的功能,支持多种标准。
首先,OpenSSL实现了ASN.1的证书和密钥相关标准,提供了对证书、公钥、私钥、证书请求以及CRL等数据对象的DER、PEM和BASE64的编解码功能。OpenSSL提供了产生各种公开密钥对和对称密钥的方法、函数和应用程序,同时提供了对公钥和私钥的DER编解码功能。并实现了私钥的PKCS#12和PKCS#8的编解码功能。OpenSSL在标准中提供了对私钥的加密保护功能,使得密钥可以安全地进行存储和分发。
在此基础上,OpenSSL实现了对证书的X.509标准编解码、PKCS#12格式的编解码以及PKCS#7的编解码功能。并提供了一种文本数据库,支持证书的管理功能,包括证书密钥产生、请求产生、证书签发、吊销和验证等功能。
事实上,OpenSSL提供的CA应用程序就是一个小型的证书管理中心(CA),实现了证书签发的整个流程和证书管理的大部分机制。
5.SSL和TLS协议
OpenSSL实现了SSL协议的SSLv2和SSLv3,支持了其中绝大部分算法协议。OpenSSL也实现了TLSv1.0,TLS是SSLv3的标准化版,虽然区别不大,但毕竟有很多细节不尽相同。
虽然已经有众多的软件实现了OpenSSL的功能,但是OpenSSL里面实现的SSL协议能够让我们对SSL协议有一个更加清楚的认识,因为至少存在两点:一是OpenSSL实现的SSL协议是开放源代码的,我们可以追究SSL协议实现的每一个细节;二是OpenSSL实现的SSL协议是纯粹的SSL协议,没有跟其它协议(如HTTP)协议结合在一起,澄清了SSL协议的本来面目。
6.应用程序
OpenSSL的应用程序已经成为了OpenSSL重要的一个组成部分,其重要性恐怕是OpenSSL的开发者开始没有想到的。现在OpenSSL的应用中,很多都是基于OpenSSL的应用程序而不是其API的,如OpenCA,就是完全使用OpenSSL的应用程序实现的。OpenSSL的应用程序是基于OpenSSL的密码算法库和SSL协议库写成的,所以也是一些非常好的OpenSSL的API使用范例,读懂所有这些范例,你对OpenSSL的API使用了解就比较全面了,当然,这也是一项锻炼你的意志力的工作。
OpenSSL的应用程序提供了相对全面的功能,在相当多的人看来,OpenSSL已经为自己做好了一切,不需要再做更多的开发工作了,所以,他们也把这些应用程序成为OpenSSL的指令。OpenSSL的应用程序主要包括密钥生成、证书管理、格式转换、数据加密和签名、SSL测试以及其它辅助配置功能。
7.Engine机制 Engine机制的出现是在OpenSSL的0.9.6版的事情,开始的时候是将普通版本跟支持Engine的版本分开的,到了OpenSSL的0.9.7版,Engine机制集成到了OpenSSL的内核中,成为了OpenSSL不可缺少的一部分。 Engine机制目的是为了使OpenSSL能够透明地使用第三方提供的软件加密库或者硬件加密设备进行加密。OpenSSL的Engine机制成功地达到了这个目的,这使得OpenSSL已经不仅仅使一个加密库,而是提供了一个通用地加密接口,能够与绝大部分加密库或者加密设备协调工作。当然,要使特定加密库或加密设备更OpenSSL协调工作,需要写少量的接口代码,但是这样的工作量并不大,虽然还是需要一点密码学的知识。Engine机制的功能跟Windows提供的CSP功能目标是基本相同的。目前,OpenSSL的0.9.7版本支持的内嵌第三方加密设备有8种,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬件加密设备。现在还出现了支持PKCS#11接口的Engine接口,支持微软CryptoAPI的接口也有人进行开发。当然,所有上述Engine接口支持不一定很全面,比如,可能支持其中一两种公开密钥算法。
8.辅助功能
BIO机制是OpenSSL提供的一种高层IO接口,该接口封装了几乎所有类型的IO接口,如内存访问、文件访问以及Socket等。这使得代码的重用性大幅度提高,OpenSSL提供API的复杂性也降低了很多。
OpenSSL对于随机数的生成和管理也提供了一整套的解决方法和支持API函数。随机数的好坏是决定一个密钥是否安全的重要前提。
OpenSSL还提供了其它的一些辅助功能,如从口令生成密钥的API,证书签发和管理中的配置文件机制等等。如果你有足够的耐心,将会在深入使用OpenSSL的过程慢慢发现很多这样的小功能,让你不断有新的惊喜。
⑧ iOS使用openSSL加密应该怎么做
最近几天折腾了一下如何在iOS上使用RSA来加密。iOS上并没有直接的RSA加密API。但是iOS提供了x509的API,而x509是支持RSA加密的。因此,我们可以通过制作自签名的x509证书(由于对安全性要求不高,我们并不需要使用CA认证的证书),再调用x509的相关API来进行加密。接下来记录一下整个流程。
第一步,制作自签名的证书
1.最简单快捷的方法,打开Terminal,使用openssl(Mac OS X自带)生成私钥和自签名的x509证书。
openssl req -x509 -out public_key.der -outform der -new -newkey rsa:1024 -keyout private_key.pem -days 3650
按照命令行的提示输入内容就行了。
几个说明:
public_key.der是输出的自签名的x509证书,即我们要用的。
private_key.pem是输出的私钥,用来解密的,请妥善保管。
rsa:1024这里的1024是密钥长度,1024是比较安全的,如果需要更安全的话,可以用2048,但是加解密代价也会增加。
-days:证书过期时间,一定要加上这个参数,默认的证书过期时间是30天,一般我们不希望证书这么短就过期,所以写上比较合适的天数,例如这里的3650(10年)。
事实上,这一行命令包含了好几个步骤(我研究下面这些步骤的原因是我手头已经由一个private_key.pem私钥了,想直接用这个来生成x509证书,也就是用到了下面的2-3)
1)创建私钥
openssl genrsa -out private_key.pem 1024
2)创建证书请求(按照提示输入信息)
openssl req -new -out cert.csr -key private_key.pem
3)自签署根证书
openssl x509 -req -in cert.csr -out public_key.der -outform der -signkey private_key.pem -days 3650
2.验证证书。把public_key.der拖到xcode中,如果文件没有问题的话,那么就可以直接在xcode中打开,看到证书的各种信息。
第二步,使用public_key.der来进行加密。
1.导入Security.framework。
2.把public_key.der放到mainBundle中(一般直接拖到Xcode就行啦)。
3.从public_key.der读取公钥。
4.加密。
下面是参考代码(只能用于加密长度小于等于116字节的内容,适合于对密码进行加密。使用了ARC,不过还是要注意部分资源需要使用CFRealse来释放)
RSA.h
//
// RSA.h
//
#import Foundation.h>
@interface RSA : NSObject {
SecKeyRef publicKey;
SecCertificateRef certificate;
SecPolicyRef policy;
SecTrustRef trust;
size_t maxPlainLen;
}
- (NSData *) encryptWithData:(NSData *)content;
- (NSData *) encryptWithString:(NSString *)content;
@end
RSA.m
//
// RSA.m
//
#import "RSA.h"
@implementation RSA
- (id)init {
self = [super init];
NSString *publicKeyPath = [[NSBundle mainBundle] pathForResource:@"public_key"
ofType:@"der"];
if (publicKeyPath == nil) {
NSLog(@"Can not find pub.der");
return nil;
}
NSDate *publicKeyFileContent = [NSData dataWithContentsOfFile:publicKeyPath];
if (publicKeyFileContent == nil) {
NSLog(@"Can not read from pub.der");
return nil;
}
certificate = SecCertificateCreateWithData(kCFAllocatorDefault, ( __bridge CFDataRef)publicKeyFileContent);
if (certificate == nil) {
NSLog(@"Can not read certificate from pub.der");
return nil;
}
policy = SecPolicyCreateBasicX509();
OSStatus returnCode = (certificate, policy, &trust);
if (returnCode != 0) {
NSLog(@" fail. Error Code: %ld", returnCode);
return nil;
}
SecTrustResultType trustResultType;
returnCode = SecTrustEvaluate(trust, &trustResultType);
if (returnCode != 0) {
NSLog(@"SecTrustEvaluate fail. Error Code: %ld", returnCode);
return nil;
}
publicKey = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog(@"SecTrustCopyPublicKey fail");
return nil;
}
maxPlainLen = SecKeyGetBlockSize(publicKey) - 12;
return self;
}
- (NSData *) encryptWithData:(NSData *)content {
size_t plainLen = [content length];
if (plainLen > maxPlainLen) {
NSLog(@"content(%ld) is too long, must < %ld", plainLen, maxPlainLen);
return nil;
}
void *plain = malloc(plainLen);
[content getBytes:plain
length:plainLen];
size_t cipherLen = 128; // 当前RSA的密钥长度是128字节
void *cipher = malloc(cipherLen);
OSStatus returnCode = SecKeyEncrypt(publicKey, kSecPaddingPKCS1, plain,
plainLen, cipher, &cipherLen);
NSData *result = nil;
if (returnCode != 0) {
NSLog(@"SecKeyEncrypt fail. Error Code: %ld", returnCode);
}
else {
result = [NSData dataWithBytes:cipher
length:cipherLen];
}
free(plain);
free(cipher);
return result;
}
- (NSData *) encryptWithString:(NSString *)content {
return [self encryptWithData:[content dataUsingEncoding:NSUTF8StringEncoding]];
}
- (void)dealloc{
CFRelease(certificate);
CFRelease(trust);
CFRelease(policy);
CFRelease(publicKey);
}
@end
使用方法:
RSA *rsa = [[RSA alloc] init];
if (rsa != nil) {
NSLog(@"%@",[rsa encryptWithString:@"test"]);
}
else {
NSLog(@"init rsa error");
}
⑨ openssl加密数据为8倍数,怎么多出8位
从编码规则中我们要使用SHA1、Base64、3DES与URLEncoding 四种加密方法并且来回来加密. 我就不都单独拿出来贴代码了,直接贴比较全的代码.
标签: 加密 算法 sha1 base64 3DES OpenSSL
代码片段(1)
[代码] [C/C++/Objective-C]代码
view source
print?
001 /**
002 * Creator: WangBin, 2009-11-26
003 * For encrypt...
004 * I cant't verify those code, What the fuck 0f 3des, Make me always get the different result.Bad thing is the memory, should be careful of those free.
005 *
006 * Need To Notice: When you get the return NULL, means wrong; Remember free memory you get from the return.
007 * How To:
008 * 1.Four parameters: str1, ID, TimeStamp, 3DesKey.
009 3DesKey should be initialied as array,like "unsigned char key[24] ={0x2C, 0x7A, 0x0E, 0x98, 0xF1, 0xE0, 0x76, 0x49, 0x73, 0x15, 0xCD, 0x25, 0xE0, 0xB5, 0x43, 0xCB, 0x0E, 0x80, 0x76, 0x01, 0x7F, 0x23, 0x8A, 0x46};"(I needn't convert them). should not be a string!!
010
011 * Find some memory leaf, Be sure the proccess context is killed!
012 */
013
014 #include
015 #include
016 #include
017 #include
018 #include
019 #include
020 #include
021 #include "encrypt.h"
022 #define MAX_URL_LEN 2048
023 #define DES3_BYTE 8
024 #define DES3_PKCS7
025
026 typedef unsigned char uchar;
027
028 uchar *sha1_encode(uchar *src)
029 {
030 SHA_CTX c;
031 uchar *dest = (uchar *)malloc((SHA_DIGEST_LENGTH + 1)*sizeof(uchar));
032 memset(dest, 0, SHA_DIGEST_LENGTH + 1);
033 if(!SHA1_Init(&c))
034 {
035 free(dest);
036 return NULL;
037 }
038 SHA1_Update(&c, src, strlen(src));
039 SHA1_Final(dest,&c);
040 OPENSSL_cleanse(&c,sizeof(c));
041 return dest;
042 }
043
044 uchar *inter_string(uchar *s1, uchar *s2, uchar *s3)
045 {
046 uchar *dst, *tmp = NULL;
047 int value;
048 size_t len;
049 if(s3 != NULL)
050 {
051 len = strlen(s1) + strlen(s2) + strlen(s3) + 2;
052 #ifdef DES3_PKCS7 //PKCS7补全法,情goolge.确保3DES加密时是8的倍数
053 value = DES3_BYTE - len%DES3_BYTE;
054 if(value != 0)
055 {
056 tmp = (uchar *)malloc((value + 1)*sizeof(uchar));
057 memset(tmp, value, value);
058 memset(tmp + value, 0, 1);
059 }
060 #endif
061 len = (DES3_BYTE - len%DES3_BYTE) + len;
062 dst = (uchar *)malloc((len + 1)*sizeof(uchar));
063 memset(dst, 0, len + 1);
064 strcpy(dst, s1);
065 strcat(dst, "$");
066 strcat(dst, s2);
067 strcat(dst, "$");
068 strcat(dst, s3);
069 if(tmp != NULL)
070 strcat(dst, tmp);
071 free(tmp); //free a pointer to NULL..not a bad thing
072 }
073 else
074 {
075 len = strlen(s1) + strlen(s2) + 1;
076 len = (DES3_BYTE - len%DES3_BYTE) + len;
077 dst = (uchar *)malloc((len + 1)*sizeof(uchar));
078 memset(dst, 0, len + 1);
079 strcpy(dst, s1);
080 strcat(dst, "$");
081 strcat(dst, s2);
082 }
083 fprintf(stderr, "inter_string = %s, //////line = %dn", dst, __LINE__);
084 return dst;
085 }
086
087 int des_encode(uchar *key, uchar *iv, uchar *in, size_t len, uchar **out, int enc)
088 {
089 int ret, i, num;
090 uchar cbc_out[512];
091 uchar key1[8], key2[8], key3[8];
092 des_key_schele ks,ks1,ks2;
093 des_cblock *iv3;
094 /************ugly to get key easily*****************/
095 memset(key1, 0, 8);
096 memset(key2, 0, 8);
097 memset(key3, 0, 8);
098 memcpy(key1, key, 8);
099 memcpy(key2, key + 8, 8);
100 memcpy(key3, key + 16, 8);
101 if ((ret = DES_set_key_checked((const_DES_cblock*)&key1, &ks)) != 0)
102 {
103 fprintf(stderr, "Key1 error %dn",ret);
104 return -1;
105 }
106 if ((ret = DES_set_key_checked((const_DES_cblock*)&key2, &ks1)) != 0)
107 {
108 fprintf(stderr, "Key2 error %dn",ret);
109 return -1;
110 }
111 if ((ret = DES_set_key_checked((const_DES_cblock*)&key3, &ks2)) != 0)
112 {
113 fprintf(stderr, "Key3 error %dn",ret);
114 return -1;
115 }
116 iv3 = (des_cblock *)malloc(strlen(iv)*sizeof(uchar));
117 memset(cbc_out,0,512);
118 memcpy(iv3,iv,strlen(iv));
119 num = len/16;
120 des_ede3_cbc_encrypt(in,cbc_out,len,ks,ks1,ks2,iv3,enc); //cbc算法
121 memcpy(*out, cbc_out, len);
122 /*
123 for(i = 0; i < num; i++)
124 des_ede3_cbc_encrypt(&(in[16*i]),&(cbc_out[16*i]),16L,ks,ks1,ks2,iv3,enc);
125 des_ede3_cbc_encrypt(&(in[16*i]),&(cbc_out[16*i]),len - num*16,ks,ks1,ks2,iv3,enc); //16位加密
126 */
127 for(i=0 ; i < len ; i++)
128 printf(" %02x",cbc_out[i]);
129 printf("n");
130 free(iv3);
131 return 0;
132 }
133 /*======================================================================
134 I dont't know what about base64+sha1
135 we use the sha1-array or a new char * from the sha1-array
136 whatever I do the char charges with ugly code
137 =======================================================================*/
138 uchar *split_byte(uchar *src, size_t len)
139 {
140 int i;
141 uchar tmp, tmp1;
142 uchar *dest = (uchar *)malloc((len + 1)*sizeof(uchar));
143 memset(dest, 0, len + 1);
144 for(i = 0; i < len/2; i++)
145 sprintf(dest + i*2,"%02x",src[i] & 0x000000ff);
146 fprintf(stderr, "function = %s, ////dest = %s, //////line = %dn", __FUNCTION__, dest, __LINE__);
147 }
148
149 uchar *encrypt_JST(uchar *ID, uchar *str1, uchar *TimeStamp, uchar * key, uchar *iv)
150 {
151 int ret, i;
152 size_t len;
153 uchar *sha1, *sha_str, *digest, *digest1, *encrypt;
154 uchar *des3, *src, *url_str, *url;
155 src = inter_string(str1, TimeStamp, NULL);
156 sha1 = sha1_encode(src);
157 if(!sha1)
158 {
159 free(src);
160 return NULL;
161 }
162 len = strlen(sha1);
163 #ifdef CONVERT_T_STR
164 sha_str = split_byte(sha1, len*2);
165 ret = base64_encode_alloc(sha_str, len*2, &digest);
166 #else
167 ret = base64_encode_alloc(sha1, len, &digest);
168 #endif
169 if(!ret)
170 {
171 free(src);
172 free(sha1);
173 #ifdef CONVERT_T_STR
174 free(sha_str);
175 #endif
176 return NULL;
177 encrypt = (uchar *)malloc(len*sizeof(uchar));
178 memset(encrypt, 0, len);
179 if(des_encode(key, iv, des3, len, &encrypt, DES_ENCRYPT))
180 {
181 free(src);
182 free(sha1);
183 #ifdef CONVERT_T_STR
184 free(sha_str);
185 #endif
186 free(des3);
187 free(digest);
188 free(encrypt);
189 return NULL;
190 }
191 ret = base64_encode_alloc(encrypt, len, &digest1);
192 if(!ret)
193 {
194 free(src);
195 free(sha1);
196 #ifdef CONVERT_T_STR
197 free(sha_str);
198 #endif
199 free(des3);
200 free(digest);
201 free(encrypt);
202 return NULL;
203 }
204 fprintf(stderr, "digest1= %s, ////////line = %dn", digest1, __LINE__);
205 url_str = inter_string(ID, digest1, NULL);
206
207 url = (uchar *)malloc(MAX_URL_LEN * sizeof(uchar));
208 url_encode(url_str, url, MAX_URL_LEN - 1);
209 fprintf(stderr, "ur = %s, ///////line = %dn", url, __LINE__);
210 free(src);
211 free(sha1);
212 #ifdef CONVERT_T_STR
213 free(sha_str);
214 #endif
215 free(des3);
216 free(digest);
217 free(encrypt);
218 free(digest1);
219 free(url_str);
220 return url;
221 }
⑩ iOS使用openSSL加密应该怎么做
使用VS2005下的Visual Studio 2005 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量) 、解压缩openssl的包,进入openssl的目录 、perl configure VC-WIN32 尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。 、ms\do_ms 在解压目录下执行ms\do_ms命令 、nmake -f ms\ntdll.mak编译后在openssl解压目录下执行,完成编译后。输出的文件在out32dll里面,包括应用程序的可执行文件、lib文件和dll文件 注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码 error C2220,于是上MSDN上查找: warning treated as error - no object file generated /WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated. 是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。 于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。