openssl实现了大部分的加密

  -out #输出文件
  -in #输入文件

  - RSA
    openssl genrsa -out 1.key 1024 #生成私钥对:RSA PRIVATE KEY
    openssl rsa -in k.txt -pubout -out p.txt #取出公钥:PUBLIC KEY(文件中记录算法类型)
  openssl rsa -in k.txt -RSAPublicKey_out  -out p.txt #取出RSAPublicKey格式公钥:RSA PUBLIC KEY

openssl生成的公私钥和一些信息是用ASN.1(RSAPublicKey)/PKCS#8(PUBLIC KEY)等编码格式来保存的,所以解base64并不能直接得到公私钥(得到DER编码格式)
可以使用在线平台解码 http://lapo.it/asn1js/
也可以用openssl的asn1parse命令查看

asn1parse是一个诊断工具,可以解析ASN.1结构的密钥,证书等


生成RSA:

私钥:

openssl genrsa -out k.txt 50 #生成50位的私钥
openssl asn1parse -i -in k.txt #解码ASN.1

返回:

0:d=0 hl=2 l= 55 cons: SEQUENCE
2:d=1 hl=2 l= 1 prim: INTEGER :00
5:d=1 hl=2 l= 7 prim: INTEGER :03A20D44C84679
14:d=1 hl=2 l= 3 prim: INTEGER :010001
19:d=1 hl=2 l= 7 prim: INTEGER :021B398DFA6501
28:d=1 hl=2 l= 4 prim: INTEGER :01F85261
34:d=1 hl=2 l= 4 prim: INTEGER :01D81B19
40:d=1 hl=2 l= 4 prim: INTEGER :015DE4E1
46:d=1 hl=2 l= 3 prim: INTEGER :5435F1
51:d=1 hl=2 l= 4 prim: INTEGER :E068D6

对应结构:

RSAPrivateKey ::= SEQUENCE {
versionVersion,
modulusINTEGER, — n
publicExponentINTEGER, — e
privateExponentINTEGER, — d
prime1INTEGER, — p
prime2INTEGER, — q
exponent1INTEGER, — d mod (p-1)
exponent2INTEGER, — d mod (q-1)
coefficientINTEGER, — (inverse of q) mod p
otherPrimeInfosOtherPrimeInfos OPTIONAL
}


记录算法类型的公钥:

openssl rsa -in k.txt -pubout -out p.txt #从私钥生成公钥,这里生成的公钥是
openssl asn1parse -i -in p.txt #分析ASN.1格式

返回:

0:d=0 hl=2 l= 34 cons: SEQUENCE
2:d=1 hl=2 l= 13 cons: SEQUENCE
4:d=2 hl=2 l= 9 prim: OBJECT :rsaEncryption
15:d=2 hl=2 l= 0 prim: NULL
17:d=1 hl=2 l= 17 prim: BIT STRING

对应结构:

SubjectPublicKeyInfo ::=SEQUENCE {
algorithmAlgorithmIdentifier{{SupportedAlgorithms}},
subjectPublicKeyBIT STRING
}

这里偏移17的地方:BIT STRING对应了结构中的subjectPublicKeyBIT STRING
这里还保存了加密算法类型

继续分析偏移17的地方:

openssl asn1parse -i -in p.txt -strparse 17

返回:

0:d=0 hl=2 l= 14 cons: SEQUENCE
2:d=1 hl=2 l= 7 prim: INTEGER :03A20D44C84679
11:d=1 hl=2 l= 3 prim: INTEGER :010001

对应结构:

RSAPublicKey ::= SEQUENCE {
modulus INTEGER, — n
publicExponentINTEGER — e
}


不记录算法类型的公钥:

openssl rsa -in k.txt -RSAPublicKey_out  -out p.txt #生成公钥
openssl asn1parse -i -in p.txt #分析ASN.1格式

返回:

0:d=0 hl=2 l= 14 cons: SEQUENCE
2:d=1 hl=2 l= 7 prim: INTEGER :03A20D44C84679
11:d=1 hl=2 l= 3 prim: INTEGER :010001

对应格式:

RSAPublicKey ::= SEQUENCE {
modulus INTEGER, — n
publicExponentINTEGER — e
}


加密:

openssl rsautl -encrypt -inkey p.txt -pubin -in flag.txt -out enflag.txt

用公钥p.txt加密
/*
注意,如果生成的公钥开头为-----BEGIN RSA PUBLIC KEY-----开头(RSA公钥)(pkcs1公钥)
openssl似乎并不支持,会返回unable to load Public Key的错误
openssl支持-----BEGIN PUBLIC KEY-----的公钥(SSL公钥)(pkcs8公钥)

openssl rsa -pubin -in p.txt -RSAPublicKey_out -out p2.txt #pkcs8公钥转pkcs1公钥
openssl rsa -RSAPublicKey_in -in p2.txt -pubout -out p.txt #pkcs1公钥转换为pkcs8公钥

*/
//如果明文信息太长会出现data too large for key size的错误,这时应该生成更长的key。或者使用大文件加密方法。

解密:

openssl rsautl -decrypt -inkey k.txt -in enflag.txt -out deflag.txt

如果私钥错误会返回RSA operation error


签名:

openssl rsautl -sign -inkey k.txt -in flag.txt -out sigflag.txt #用私钥签名
openssl rsautl -verify -inkey p.txt -pubin -in sigflag.txt -out checkflag.txt #用公钥验证签名

注意如果签名的是明文本身,验证出来的也是明文本身,所以一般对hash签名
一般采取先签名后加密的方法


生成加密的私钥

openssl genrsa -des -out k.txt 1000 #用DES加密(默认CBC模式)
openssl rsa -in k.txt -text #查看私钥信息
openssl rsa -in k.txt -out k.txt #删除密码



其他加密算法(DES为例):

#DES
openssl des -in flag.txt  #可以发现密文前面都默认带有"Salted__"
#-base64 加密后或者解密前进行base64
#-K 指定密码 并且需要-vi指定初始化向量
#-k 指定密码 初始化向量可以自动生成
#-d 解密 如果密文格式不正确会报"bad magic number" //注意openssl并不只保存密文,还有初始化向量等数据 //一般解密用openssl enc -d -算法
#-salt 使用随机盐
#-S 指定盐
#-p 输出各参数

key的填充和盐有关
猜测密文格式应该是"Salted__"+随机或指定的盐+初始化向量+密文