оПНЕЙР БКХКЯЪ Б DEMETRA-PROJECT Х ОЕПЕЕУЮК  [[ ОЕПЕИРХ ]]

This page is CODEPAGE KOI8-R! Changes in your browser settings.

OPENSSL

На основе текста:
Автор: 	Vsevolod A. Stakhov/CEBKA
E-mail: VStakhov tehnopark org
---------------------------------------------------------------
Постоянная ссылка к статье: http://www.nixp.ru/articles/openssl
---------------------------------------------------------------

OpenSSL может использоваться во множестве случаев и умеет выполнять следующие задачи:

* Создавать и управлять ключами RSA и DSA - команды rsa, dsa, dsaparam
* Создавать сертификаты формата x509, запросы на сертификацию, восстановление -
  команды x509, req, verify, ca, crl, pks12, pks7
* Зашифровывать данные с помощью симметрического или асимметрического шифрования - 
  команды enc, rsautl
* Высчитывать хеши различных типов - команда dgst
* Работа с S/MIME - команда s/mime
* Проверка работы серверов и клиентов ssl - команды s_client, s_server.

-----------------------------------------------------------------------
Standard commands openssl
asn1parse      ca             ciphers        crl            crl2pkcs7      
dgst           dh             dhparam        dsa            dsaparam       
enc            engine         errstr         gendh          gendsa         
genrsa         nseq           ocsp           passwd         pkcs12         
pkcs7          pkcs8          prime          rand           req            
rsa            rsautl         s_client       s_server       s_time         
sess_id        smime          speed          spkac          verify         
version        x509           

Message Digest commands (see the `dgst' command for more details)
md2            md4            md5            mdc2           rmd160         
sha            sha1           

Cipher commands (see the `enc' command for more details)
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc    
aes-256-ecb    base64         bf             bf-cbc         bf-cfb         
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc      
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc        
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb    
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb   
des-ofb        des3           desx           rc2            rc2-40-cbc     
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb        
rc4            rc4-40         rc5            rc5-cbc        rc5-cfb        
rc5-ecb        rc5-ofb        
-----------------------------------------------------------------------

На машине с процессором,    
# cat /var/run/dmesg.boot | grep CPU
##################################################
CPU: AMD Athlon(tm) XP (1102.51-MHz 686-class CPU)
##################################################

Скорость генерации ssl будет:
sh# openssl speed
-----------------------------------------------------------------------------------------
OpenSSL 0.9.7e-p1 25 Oct 2004
built on: Fri Jan 12 06:26:06 UTC 2007
options:bn(64,32) md2(int) rc4(idx,int) des(ptr,risc1,16,long) aes(partial) blowfish(idx) 
compiler: cc
available timing options: USE_TOD HZ=128 [sysconf value]
timing function used: getrusage
The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md2                785.32k     1694.47k     2384.26k     2652.44k     2742.97k
mdc2              1914.96k     2230.24k     2331.17k     2366.23k     2373.75k
md4               6282.25k    22541.42k    68293.74k   138635.25k   198016.44k
md5               4960.79k    17123.82k    47522.60k    84120.42k   110968.53k
hmac(md5)         6644.73k    21930.99k    56450.91k    92847.05k   114630.92k
sha1              5309.37k    16313.24k    38613.16k    58646.08k    69140.87k
rmd160            3694.50k    11445.42k    27515.02k    42453.17k    50361.86k
rc4              85999.34k    98077.49k   101002.39k   102156.52k   102641.80k
des cbc          28164.45k    29525.35k    29879.12k    30003.74k    29949.25k
des ede3         10603.55k    10785.04k    10856.83k    10877.25k    10836.85k
idea cbc             0.00         0.00         0.00         0.00         0.00 
rc2 cbc           9929.57k    10457.93k    10592.37k    10614.50k    10632.55k
rc5-32/12 cbc    72167.12k    85850.02k    89506.75k    90806.62k    91260.29k
blowfish cbc     42786.60k    45905.62k    46749.15k    47040.58k    47186.61k
cast cbc         39661.75k    42370.65k    43032.10k    43342.49k    43246.62k
aes-128 cbc      21211.86k    21920.99k    22280.49k    22201.65k    22295.26k
aes-192 cbc      18648.44k    19114.85k    19378.33k    19483.23k    19490.68k
aes-256 cbc      16466.24k    16989.53k    17210.29k    17258.22k    17283.63k
                  sign    verify    sign/s verify/s
rsa  512 bits   0.0014s   0.0001s    737.5   8574.4
rsa 1024 bits   0.0058s   0.0003s    171.1   3377.7
rsa 2048 bits   0.0318s   0.0009s     31.4   1112.4
rsa 4096 bits   0.2016s   0.0031s      5.0    324.3
                  sign    verify    sign/s verify/s
dsa  512 bits   0.0010s   0.0012s    984.9    825.6
dsa 1024 bits   0.0027s   0.0032s    373.6    313.6
dsa 2048 bits   0.0084s   0.0103s    119.0     96.6
-----------------------------------------------------------------------------------------

Можно так же сделать выборку из групп алгоритмов по схеме
--------------------
openssl ciphers NAME
--------------------
где NAME - это символическое название
группы алгоритмов. Обычно используются значения 
LOW - алгоритмы низкого уровня безопасности(<128 бит)
MEDIUM - алгоритмы среднего уровня стойкости(128 бит)
HIGH - алгоритмы высокой стойкости(> 128 бит)
ALL - все алгоритмы
NULL - алгоритмы без шифрования.

sh# openssl ciphers HIGH
----------------------------------------------------------------------------------------------------------------------------------------------------
ADH-AES256-SHA:DHE-RSA-AES256-SHA:DHE-DSS-AES256-SHA:AES256-SHA:EDH-RSA-DES-CBC3-SHA:EDH-DSS-DES-CBC3-SHA:DES-CBC3-SHA:ADH-DES-CBC3-SHA:DES-CBC3-MD5
----------------------------------------------------------------------------------------------------------------------------------------------------
Именно это и интересно... ;)

Создание файла с рандомными данными и но основе файла -rand и длинны num:
-----------------------------------------
openssl rand [-out file] [-rand file] num
-----------------------------------------
Хотя можно просто получить строку на stdout с рандомными данными:
sh# openssl rand -rand /dev/urandom 50
------------------------------------
аF╥tецOО`'╬taaКщUzдnИ ЦУ║Ц2/Ы©eПKP╧e
------------------------------------
В качесте файла для -rand можно указать /dev/random или /dev/urandom 
или создать свой файл с рандомными данными и его использовать.
sh# dd if=/dev/random of=random.txt count=128
-------------------------------------------------------------
128+0 records in
128+0 records out
65536 bytes transferred in 0.005290 secs (12388584 bytes/sec)
-------------------------------------------------------------
Ну и на основе его сгенерим строку:
sh# openssl rand -rand random.txt 50
---------------------------------
zъEcIQФIСpГG
╦╣Т╝╜╪]rik╥6╘#Л27╥1/ч?ОЪОЮЗ
                                U
---------------------------------				

RSA - криптографический алгоритм с открытым ключом для шифрования и цифровой подписи.
Команда genrsa создает секретный ключ длиной bits в формате PEM, шифрует его одним из алгоритмов: 
des (56 бит), des3 (3-й des 168 бит) или idea (128 бит) иначе если шифрование не указано ключ не
шифруется.
---------------------------------------------------------------------
openssl genrsa [-out file] [-des | -des3 | -idea] [-rand file] [bits]
---------------------------------------------------------------------

sh# openssl genrsa -out rsa-key.pem -des3 -rand /dev/urandom 4096
----------------------------------------------------
2048 semi-random bytes loaded
Generating RSA private key, 4096 bit long modulus
...........++
.....................++
e is 65537 (0x10001)
Enter pass phrase for rsa-key.pem: xxxxxx
Verifying - Enter pass phrase for rsa-key.pem: xxxxxx
-----------------------------------------------------
Мы создали секретный ключ, зашифровали его и записали в файл (в текстовом виде). 

Если его ключ пропустить через cat на stdout, можно будет увидеть в начале
ключа алгоритм шифрования. 
sh# cat rsa-key.pem
################################################################
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,94FC35143D398EB5

yzsYB3C0PDTWy9vLu+gifkm6oGXnLe5Mz9wSVN/rELBPwzDFmHIEfTPpeBeja8pl
p+WaZh5ch6unqsITud4j69JN+07JZ6oJyZPsNioVKftgprzGHzuDH7X6dnLT8+jx
RmfNurbxkAmZow7tStYRU4KB6rLNjU7f7rHNoJsZYWtPZyFPxqMfs2T/TFj05Gy5
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
jajk9rrphJ4zVt8+42EwCSE8RGdh87Vu8WWPAKm/dASggiFUY9Sd1sCireWd+0Vb
ARAXy+b7yGUSpeSgc41jqZvkX/B4GfPAH10hPnuA97biwDFiMRxxjoOvNmhHT0GQ
sVXhGJh0wweDorUErbx3Wu6gOvGSzb+/gs1gZw1KVG1JYU2TKZqfYy+XxKt7EvES
-----END RSA PRIVATE KEY-----
################################################################

Для создания публичного ключа rsa на основе секретного используется 
команда openssl rsa. Даная команда имеет следующий формат:
-----------------------------------------------------------------------------
openssl rsa -in filename [-out file] [-des | -des3 |-idea] [-check] [-pubout]
-----------------------------------------------------------------------------
Утилита openssl rsa способна изменять пароль и алгоритм шифрования секретного 
ключа, будучи вызвана с параметром -in и -out. 
Если применить параметр -pubout, то в указанный файл -out будет записан 
публичный ключ, вычисленный на основе -in секретного. Например, создание 
публичного ключа на основании секретного:
sh# openssl rsa -in rsa-key.pem -out pub-rsa-key.pem -pubout
----------------------------------------
Enter pass phrase for rsa-key.pem: xxxxx
writing RSA key
----------------------------------------

sh# cat pub-rsa-key.pem 
################################################################
-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEArdK5buoc52OrEe+45S0w
0rRTpfawqNNH0U5jqI+AckhkyeKzgkp4BNFvFHpz87LmLqk8RWJpZbxSrrjGNpCN
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
tDsIgze3/Bik38q+mJYpuAykN4FsBusvdsSnQV6JMIsJ5LUKxxTdm/J01Jdk6IVI
sqeVd85S6rc/fHYGGp+Rb/nXVf9SX1Ey9cGIUArh5fF107GjNVlH+Q0bXS49jaBD
6Fmz7nvizqsta55TXfJ/B1ECAwEAAQ==
-----END PUBLIC KEY-----
################################################################

Хотя можно и поменять пароль и алгоритм шифрования у секретного
ключа rsa-key.pem:
sh# openssl rsa -in rsa-key.pem -out rsa-key1.pem -aes256
-----------------------------------------
Enter pass phrase for rsa-key.pem: xxxxxx
writing RSA key
Enter PEM pass phrase: xxxxxxx
Verifying - Enter PEM pass phrase: xxxxxx
-----------------------------------------

Просмотр результата:
# cat rsa-key1.pem 
################################################################
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,DB6E2C246ED94086A0A73254C0FB3B51

jbbHPlMDGgBIeCONSJ+t7qiMcXMzUqgGrBmtXybvTjfNGGXcBwR0bvmDBYwMqOP2
XRQj6LCx00v1fihprh59yclKUwsfUgckJbzA3VUp2+xZ+i1dPUqOxFMsc4asVQBl
b3UbPzQrxvXCVOlSONS3mxu2HORHTTjikp1yEXvmy1SMaR8nCuSdzNfeGGU8Bc+o
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
h+2WCQmGLNg2WGPT13H+/cSekvtLDD7LAsJnRI+jwaaib/xdnykWw744GA48sz7d
3Bp/hhgs3cMiKNMI+NHO2PfmamQNhv6UziLEUM1oPxhySfjnYUwk2VnkVIb/Z+Gw
sHVOj9UQD3eJr6ug/PTEXNYWSQzSBBI+j3UWq2FYp9Vz/HSTa87Fpl/QoKZ+15A6
-----END RSA PRIVATE KEY-----
################################################################

DSA - алгоритм с использованием открытого ключа для создания электронной 
подписи, НО НЕ ДЛЯ ШИФРОВАНИЯ!

Для создания ключей DSA используется утилита openssl gendsa, аналогичная genrsa,
но есть два отличия: 
1. Для DSA-ключей нельзя указывать длину в битах 
2. Ключи DSA могут генерироваться согласно параметрам, записанным в файл 
paramfile утилитой openssl dsaparam. dsaparam имеет следующий формат:
-------------------------------------------------------------------    
openssl dsaparam [-rand file{s}] [-C] [-genkey] [-out file] numbits
-------------------------------------------------------------------    
numbits - длина желаемого ключа, 
-С 	- заставляет dsaparam вывести на stdout код на СИ 
-genkey - выходной файл с параметрами, дополнительно записывается созданный 
секретный ключ DSA, но нельзя его сразу же зашифровать, поэтому удобнее воспользоваться 
утилитой openssl gendsa, которая имеет схожий синтаксис с командой genrsa, но вместо 
числа бит указывается файл параметров, созданный dsaparam:

sh# openssl dsaparam -rand /dev/urandom -C -genkey -out dsaparam.cfg 4096
----------------------------------------------------------------------------------------------------------------------
2048 semi-random bytes loaded
Generating DSA parameters, 4096 bit long prime
This could take some time
............+.....+..............+..+.....+.......+.+.............+++++++++++++++++++++++++++++++++++++++++++++++++++*
+.....+.+...............................+..............+........+..........+..........+.................+..............
....................................+.......+........+..+.......+.......+....+...+..+........+.+...............+.......
................+...........+..........................+.....+..........+.+......+..+.....+..+....+.+.........+........
..+..+.....+....+.....+..+.+.........+.+......+.....................+...........+.....+...+............+.+.............
.........+....+.............................+...+.....+...+...............+..+....................+....................
...........+...+..+........+.......+...+................+.+.....+.+.+.....+.........+..+........+...+.............+....
..+.....+..........+++++++++++++++++++++++++++++++++++++++++++++++++++*
static unsigned char dsa4096_p[]={
	0x9C,0xAC,0xDF,0xD9,0x9B,0x37,0xEB,0xB3,0x25,0x19,0xF3,0x84,
	0x73,0x58,0xF4,0x7A,0xAB,0xA2,0x0F,0x3B,0x7B,0xF9,0x87,0x01,
	0x43,0x67,0x62,0x68,0xB7,0x00,0xDD,0xB3,0x8B,0x28,0xE5,0x21,
	0xF0,0x96,0x01,0xBF,0x58,0x0B,0xC2,0x14,0x2A,0x52,0xFE,0xF1,
	0xE8,0x5B,0x1C,0xEB,0x10,0x86,0x51,0xFA,0x05,0x0B,0xD9,0xE7,
	0x56,0xB7,0x23,0xDB,0xF4,0x5E,0x0A,0xB8,0xF1,0x80,0x93,0x07,
	0x7F,0xE1,0xC4,0x13,0x46,0xA9,0x56,0x2E,0xCC,0xDC,0x9A,0x03,
	0x44,0x49,0x7A,0xEF,0x31,0x6E,0x99,0x57,
	};
static unsigned char dsa4096_q[]={
	0xF9,0x4A,0x7F,0x66,0x28,0xB6,0xC4,0x51,0x83,0x97,0x17,0x6A,
	0x98,0x59,0xB8,0x18,0x1D,0xC3,0x03,0xAD,
	};
static unsigned char dsa4096_g[]={
	0x15,0x7D,0x50,0xB1,0xD3,0xD5,0x98,0x36,0x0D,0x66,0x66,0xB5,
	0xF0,0x72,0x07,0x83,0x10,0x5B,0xD5,0x00,0x56,0x50,0x51,0x8F,
	0x0E,0x82,0x1D,0x57,0x2D,0x1B,0x5A,0x78,0xCA,0x96,0x95,0x60,
	0xE6,0x17,0xD3,0x1D,0x64,0xA5,0x8E,0xB5,0x96,0x87,0x14,0xB5,
	0x75,0x70,0x6F,0x01,0x3A,0xB4,0xB4,0x43,0x4C,0x5D,0x21,0x51,
	0xB5,0xFB,0x65,0x36,0x9B,0x44,0xA8,0x35,0xFF,0x53,0x82,0x89,
	0x27,0x2F,0xC0,0x03,0xC7,0xBB,0x24,0xF5,
	};

DSA *get_dsa4096()
	{
	DSA *dsa;

	if ((dsa=DSA_new()) == NULL) return(NULL);
	dsa->p=BN_bin2bn(dsa4096_p,sizeof(dsa4096_p),NULL);
	dsa->q=BN_bin2bn(dsa4096_q,sizeof(dsa4096_q),NULL);
	dsa->g=BN_bin2bn(dsa4096_g,sizeof(dsa4096_g),NULL);
	if ((dsa->p == NULL) || (dsa->q == NULL) || (dsa->g == NULL))
		{ DSA_free(dsa); return(NULL); }
	return(dsa);
	}
----------------------------------------------------------------------------------------------------------------------
Вывалило целую кучу... ;)

# cat dsaparam.cfg 
################################################################
-----BEGIN DSA PARAMETERS-----
MIIEIAKCAgEAnKzf2Zs367MlGfOEc1j0equiDzt7+YcBQ2diaLcA3bOLKOUhO8Mm
MJnGy2y7nkNQNYXampOVXqQjEdC1I7UW+Va4mPgtvypv5THGiVD3UBscseggBefm
BDeY7dwS6jmYFRn6CMnd+uAZ0H9lqVGkmWBRYOjfc0VIrLXMNUJ5ZTZsyEiTZdRO
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
Z8jn4e8r15CVy5bwB349a/JqWY2TVWZpS54PkSr53jHIOabfgg3lk7R/uYwuDpoQ
JZoR1ADPtjrOJafgIoRdEjDRDWXVZexmZuk0ovGYdmZso402bOSs7tnWTIcGo+jB
UyXtawsyJyfjGZ5sD4ROqcJ0LASFzb08GzAT6xnlBlVOTJPpamshYYdy76InpCiS
-----END DSA PARAMETERS-----
-----BEGIN DSA PRIVATE KEY-----
MIIGPQIBAAKCAgEAnKzf2Zs367MlGfOEc1j0equiDzt7+YcBQ2diaLcA3bOLKOUh
O8MmMJnGy2y7nkNQNYXampOVXqQjEdC1I7UW+Va4mPgtvypv5THGiVD3UBscsegg
BefmBDeY7dwS6jmYFRn6CMnd+uAZ0H9lqVGkmWBRYOjfc0VIrLXMNUJ5ZTZsyEiT
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
EBPjQsX2gsRlvdmmaf/z858RWG9MvrphIaEbizFN84sScOthMpMGL6YlD1XT5Dj9
1NYD4V4NLgBJBZwoS/QauXVd2LFjA5D04hcn0DCd4ULISDsNcwdAANBxdwIUWD8q
8QCZu53qhVS3pwBj5HqrRPk=
-----END DSA PRIVATE KEY-----
################################################################

И на основе полученого файла создаём ключ dsa
sh# openssl gendsa -out dsa-key.pem -rand /dev/urandom -des3 dsaparam.cfg
-----------------------------------------
2048 semi-random bytes loaded
Generating DSA key, 4096 bits
Enter PEM pass phrase: xxxxxx
Verifying - Enter PEM pass phrase: xxxxxx
-----------------------------------------

sh# cat dsa-key.pem 
################################################################
-----BEGIN DSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,D4AF71B418716E88

MkZYoSS++hsORUD0XUFjYSlScs8I0p3QvkdCA2QFDmaNVYVb74hKfO9j2heBjqhd
XFajlGuFVJRVwH6sZZcDLvI2grQiUrdn6FNHx57MO1DUDJoiq7VQIhlQtDBP6jZA
p1fU8K0o/t/NGkU2OhRZ6L6uZbjtrCxj7XCG/TlQiiYR4A70P1wh6OG9fwKDX9Sa
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
VhFJFsWQ9PWTu/GoeWY+8ll1Dx+LjARZHdGwrSZqyfWAWzC2e5TdsFUEggjhyObi
gFZZndYNuTkYZdJdI/sL4rVjULlisJtH1fXT2DmtjPyKmL+ItvqYmxLRnc/+UvMX
CRREooQyKlIBosAkAcT6sDzgjDCwbzKjuw+IcU0g0mhU+UPVflbqt6BHjNa2uKXO
/tMY7ruXo5tE1BaJC+friTdSdWiZ/mGS
-----END DSA PRIVATE KEY-----
################################################################

И по аналогии с rsa мы можем создать public dsa key
sh# openssl dsa -in dsa-key.pem -out pub-dsa-key.pem -pubout
-----------------------------
read DSA key
Enter PEM pass phrase: xxxxxx
writing DSA key
-----------------------------

# cat pub-dsa-key.pem 
################################################################
-----BEGIN PUBLIC KEY-----
MIIGOjCCBC0GByqGSM44BAEwggQgAoICAQCcrN/ZmzfrsyUZ84RzWPR6q6IPO3v5
hwFDZ2JotwDds4so5SE7wyYwmcbLbLueQ1A1hdqak5VepCMR0LUjtRb5VriY+C2/
Km/lMcaJUPdQGxyx6CAF5+YEN5jt3BLqOZgVGfoIyd364BnQf2WpUaSZYFFg6N9z
	-SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP- -SKIP-
f8/yH3ss+s9+1YB2gut0tNpCyZNFAiSBBQ+Xnh6Y95DJxpNYtA2GfZ64kS3wp8Go
S/0M/lUxAIrOO1dTI+hx7w+9iKkQjwvwRdE5CkTLg1mLpj/95W9RZYOHuwsKR9Wv
5dt9ccaThe4gjWK72+w=
-----END PUBLIC KEY-----
################################################################

Шифрование файлов с помошью openssl.
Наиболее популярными являются следующие: 
------------------------------------------------
base-64 	(преобразование в текстовый вид)
bf 		(blowfish - 128 бит) 
des 		(56 бит) 
des3 		(168 бит) 
rc4 		(128 бит) 
rc5 		(128 бит) 
rc2 	 	(128 бит)
idea	 	(128 бит)
------------------------------------------------

Зашифруем:
sh# openssl des3 -in /var/log/messages -out messages.des3
----------------------------------------------------------
enter des-ede3-cbc encryption password: xxxxxx
Verifying - enter des-ede3-cbc encryption password: xxxxxx
----------------------------------------------------------
Если посмотреть, файл стал нечитабельным

Расшифруем:
sh# openssl des3 -d -in messages.des3 -out messages
----------------------------------------------
enter des-ede3-cbc decryption password: xxxxxx
----------------------------------------------
Снова можно любоваться содержимым файла.

sh# openssl base64 -in /var/log/messages -out messages.base64
Файл преобразовался но пароль не нужно было вводить, так как
не произошло шифрование.

Но не нужно забывать что:
-d - рашифровка
-a - подмешивание base64, например, к blowfish
-k - задать пароль как параметр...

Пример в обе стороны:
sh# openssl bf -a -k 123456 -in /var/log/messages -out messages.bf-b64
sh# openssl bf -a -d -k 123456 -in messages.bf-b64 -out messages

С помощью openssl можно производить вычесление хэшей (контрольных сумм).
Алгоритмы хеширования могут применяться следующие: 
-------------------------
md2	 	(128 бит) 
md4		(128 бит) 
md5		(128 бит) 
mdc2 		(128 бит) 
sha	 	(160 бит) 
sha1 		(160 бит) 
ripemd160 	(160 бит)
-------------------------

sh# openssl md5 messages 
-----------------------------------------------
MD5(messages)= 4dbd7d70812c470da225b5033306eb3d
-----------------------------------------------

sh# openssl rmd160 messages 
-------------------------------------------------------------
RIPEMD160(messages)= 900163f2e67b80b1e1bdbfa03bf335bae0d53252
-------------------------------------------------------------
Чё-так типа того. ;)

Утилита openssl dgst может использоваться для подписывания сообщения секретным 
ключом и проверки ЭЦП публичным ключом. Для этого используется следующий синтаксис:
--------------------------------------------------------------
openssl dgst -sign private_key -out signature -hashalg file[s]
--------------------------------------------------------------

Создадим файл с сигнатурой file.sig на основе приватного ключа для messages
sh# openssl dgst -sign rsa-key.pem -out file.sig -md5 /var/log/messages
-----------------------------------------
Enter pass phrase for rsa-key.pem: xxxxxx
-----------------------------------------

И проверка по сигнатуре с публичным ключом выдала успех иначе (Verification Failure):
sh# openssl dgst -signature file.sig -verify pub-rsa-key.pem /var/log/messages 
-----------
Verified OK
-----------

Теперь самое интересное и НУЖНОЕ: С-Е-Р-Т-И-Ф-И-К-А-Т-Ы

Файлы сертификатов X.509 
Получение, выдача, передача и резервное копирование сертификатов и секретных ключей сопровождаются сохранением 
их данных в специальных файлах. Чаще всего для этого используются файлы со следующими расширениями:
*.cer - сертификат, сохраненный в стандарте CER. Может включать сертификат, секретный ключ, путь сертификации.
*.der - сертификат, сохраненный в стандарте DER. Может включать сертификат, секретный ключ, путь сертификации.
*.crt - файл сертификата в формате CER, DER или Netscape.
*.pem - сертификат в кодировке Base64. Может также включать полный путь удостоверения сертификата и секретный ключ.
*.p8 - файл, содержащий секретный ключ, защищенный по стандарту PKCS#8.
*.p12 (в Windows используется расширение *.pfx) - файл сертификата, защищенный по стандарту PKCS#12. 
Может включать сертификат, секретный ключ, путь сертификации.

Логика такая:
Сертификат содержит публичный ключ, подписанный одним из корневых доверенных центров сертификации 
(или комплементарным секретным ключом), данные об организации, выдавшей сертификат и в некоторых 
случаях зашифрованный секретный ключ, а также отпечаток (хеш) публичного ключа. Сертификаты имеют 
время действия, по окончанию которого они автоматически считаются недействительными.

Реализация в теории (ПРАВИЛЬНАЯ):
1. Клиент создает сертификат 
2. Клиент отправляет свой публичный сертификат (PKCS#7) в центр сертификации
3. В центре сертификации обрабатывается запрос клиента (запрос на сертификацию) и
   и сертификат клиента подписывается секретным ключом центра сертификации 
4. Клиент, имея публичный ключ центра сертификации, проверяет подлинность подписи и 
   может далее использовать свой сертификат 
   
Для организации: 
1. На сервере создается сертификат организации
2. Генерируется запрос на сертификацию и отправляется к некоему доверенному центру сертификации 
   (который будет известен всем клиентам и персоналу данной организации); 
3. Получается сертификат организации, который можно использовать при создании сертификатов клиентов
   Последние создаются так: 
a) клиент посылает запрос на выдачу сертификата; 
b) сервер создает сертификат клиента и подписывает его сертификатом организации; 
c) клиент получает сертификат клиента и сертификат организации; 

На практике:
   После проверки достоверности ключа организации проверяется достоверность сертификата клиента. 
   После такой операции клиент будет точно уверен, что получил сертификат от данной организации, 
   и может его использовать для работы с ней. 
   
Реализация в теории (НЕ ПРАВИЛЬНАЯ):
   Зачастую сертификат организации бывает подписан самим собой, что требует от клиента 
   добавить сертификат организации к доверенным, напротив в ПРАВИЛЬНОЙ схеме сертификат 
   организации принадлежит к группе промежуточных центров сертификации.

На практике:
Создадим конфиг
sh# cat cert.cnf 
-------------------------------------------------------
[ req ]
# длинна ключа
default_bits = 4096
# имя ключа
default_keyfile = key.pem
# имя организации выдающей сертификат
distinguished_name = JSC_Fort_Dialog
# если не указать этот параметр, то
# придёться интерактивно задавать
# данные для заполнения полей...
prompt = no

[ JSC_Fort_Dialog ]
# страна
CN=RU
# область
ST=Tatarstan
# город
L=Nab.Chelny
# организация
O=JSC Fort Dialog
# отделение
OU=OIT
# Имя для сертификата (персоны, получающей сертификат)
CN=RootCA
# почтовый ящик организации
emailAddress=admin@chelny.fortd.ru
-------------------------------------------------------

Создадим новый сертификат CA стандарта X.509 на основе нашего закрытого ключа использую
вышенаписаны конфиг сроком на 1 год. Итак, сначала создадим ключ, потом сертификат...
sh# openssl genrsa -out CAkey.pem -des3 -rand /dev/urandom 4096
sh# openssl req -x509 -new -key CAkey.pem -config cert.cnf -out CAcert.pem -days 365
Получили self-signed (самоподписаный, корневой) сертификат, именно этим сертификатом
можно подписывать клиентские сертификаты.