Шифрование и дайджесты сообщений. Генерация ключей средствами Java. Основные криптографические механизмы, страница 2

1      Шифрование и дайджесты сообщений

Криптография для «чайников»


Генерация ключей средствами Java

Симметричное шифрование (AES)

Шифрование с открытым ключом (RSA)

Создание дайджестов (хешей) сообщений

Компоненты процесса шифрования/дешифрования

Параметризованный алгоритм (javax.crypto.Cipher)

Входное сообщение (InputStream)

Выходное сообщение (OutputStream)

// Cipher.ENCRYPT_MODE или Cipher.DECRYPT_MODE int mode = . . . Key key = . . .

Cipher cipher = Cipher . getInstance ("AES" ) ; cipher . i n i t (mode , key ) ;

InputStream            in =      . . .

OutputStream           out =      . . .

Подготовка буферов для блоков данных int b l o c k s i z e = cipher . getBlockSize ( ) ; int outputsize = cipher . getOutputSize ( b l o c k s i z e ) ;

byte [ ] inBytes = new byte [ b l o c k s i z e ] ; byte [ ] outBytes = new byte [ outputsize ] ;

i n t inLength = 0; while ( true ) { inLength = in . read ( inBytes ) ;

i f ( inLength < b l o c k s i z e ) break ;


i n t outLength = cipher . update ( inBytes , 0 , blocksize , outBytes ) ;

out . write ( outBytes ,           0 ,       outLength ) ;

}

i f ( inLength > 0) outBytes = cipher . doFinal ( inBytes , 0 , inLength ) ; else outBytes = cipher . doFinal ( ) ; out . write ( outBytes ) ;

1      Шифрование и дайджесты сообщений

Криптография для «чайников»


Генерация ключей средствами Java

Симметричное шифрование (AES)

Шифрование с открытым ключом (RSA)

Создание дайджестов (хешей) сообщений

1  Алиса: создание симметричного ключа и шифрование сообщения (AES)

2  Алиса: шифрование симметричного ключа открытым ключом Боба (RSA)


Передача зашифрованного симметричного ключа и зашифрованного сообщения от Алисы Бобу

4  Боб: дешифрование симметричного ключа закрытым ключом (RSA)

5  Боб: дешифрование сообщения (AES)

Шифрование и сохранение симметричного ключа в потоке выходного сообщения

Cipher cipher = Cipher . getInstance ("RSA" ) ; cipher . i n i t ( Cipher .WRAP_MODE, publicKey ) ;

byte [ ]              wrappedKey = cipher . wrap (AESKey ) ;

DataOutputStream os = new DataOutputStream ( out ) ; os . w r i t e I n t ( wrappedKey . length ) ; os . write ( wrappedKey ) ;

Загрузка симметричного ключа из потока входного сообщения и дешифрование

DataInputStream i s = new DataInputStream ( in ) ; int length = i s . readInt ( ) ;

byte [ ]              wrappedKey = new byte [ length ] ;

in . read ( wrappedKey ) ;

Cipher cipher = Cipher . getInstance ("RSA" ) ; cipher . i n i t ( Cipher .UNWRAP_MODE, privateKey ) ;

Key AESKey = cipher . unwrap ( wrappedKey , "AES" ,

Cipher .SECRET_KEY) ;

1      Шифрование и дайджесты сообщений

Криптография для «чайников»


Генерация ключей средствами Java

Симметричное шифрование (AES)

Шифрование с открытым ключом (RSA)


Создание дайджестов (хешей) сообщений SHA-1

MD5

Создание дайджеста с побайтовым накоплением

MessageDigest             alg =

MessageDigest . getInstance ("SHA1" ) ;

InputStream       in = new FileInputStream ("message . txt " ) ; int ch ; while             (( ch=in . read ()) != −1) alg . update (( byte ) ch ) ;

byte [ ]          hash = alg . d i g e st ( ) ;

for        ( byte b      :     hash )

System . out . p r i n t f ("%02x " ,          0xFF & b ) ;

e7 7f ac 66 c0 9c f7 55 d0 20 9a 4b 45 d4 78 d6 10 2e 11 73

Создание дайджеста байтового буфера

MessageDigest             alg =

MessageDigest . getInstance ("SHA1" ) ;

String msg = "Это послание студентам кафедры ИВЭ!" ; alg . update (msg . getBytes ( ) ) ; byte [ ] hash = alg . d i g e st ( ) ;

for        ( byte b      :     hash )

System . out . p r i n t f ("%02x " ,          0xFF & b ) ;

97 0e a2 8b 5f b1 e6 72 37 16 41 77 9b 7c 5a 8b d2 6f c0 f0