<< Предыдущая

стр. 75
(из 82 стр.)

ОГЛАВЛЕНИЕ

Следующая >>

ма векторов. С другой стороны, можно считать, что В — полная,
а. А — линейно независимая. Поэтому т ^ п. Но такое возможно
только при т = п. Отсюда вытекает теорема.

Теорема А.58. Все базисы конечномерного пространства V со­
стоят из одинакового числа элементов. Это число называется раз­
мерностью пространства V и обозначается символом dim У.
Ясно, что dimK^ = п. Это согласуется с интуитивным пред­
ставлением: п-компонентные векторы живут в п-мерном мире. За­
метим, что говоря о размерности, необходимо четко понимать, о
каком множестве скаляров идет речь, т. е. над каким полем рассма­
тривается векторное пространство. Для этого иногда используется
обозначение dim/^ V. Важность скаляров для размерности следует,
например из следующих равенств:
dime С = 1, dim^ С = 2, dimQ С = оо.
Последние утверждения приложения оставим в качестве упраж­
нений.
Подумайте, почему на каждом шаге мы можем менять какой-то х на очередной
г/, т.е. почему, например, не может быть такого равенства: уз = Xiyi + Л2У2 +
-|-Ожз + • • • + Ожт? — Прим. перев.
488 Приложение А, Основная математическая терминология

Теорема А.59. Пусть V — (ненулевое) конечномерное векторное
пространство размерности п. Тогда
1. Любую линейно независимую систему векторов А dV можно
дополнить до базиса В z:> А.
2. В любой полной системе векторов С CV можно выбрать базис
Вес.
3. Число векторов в любой линейно независимой системе векто­
ров из V не превосходит п.
4. Линейно независимая система, состоящая из п векторов, явля­
ется базисом.
5. В любой полной системе векторов найдется не менее п векто­
ров.
6. Полная система, состоящая из п векторов, является базисом.

Теорема А.60. Пусть W — подпространство конечномерного век­
торного пространства V. Тогда dimW ^ d i m F , причем равенство
размерностей говорит о том, что W = V.
Приложение Б
Примеры на языке Java

в этом приложении приведены примеры использования стандарт­
ных библиотек программ, встроенных в язык программирования
Java^ для реализации некоторых концепций этой книги. Стандарт­
ные классы библиотек в Java 1.2 и выше обеспечивают поддержку
цифровых подписей и хэш-функций.
Чтобы получить поддержку шифрования, необходимо инсталли­
ровать криптографические инструменты Java (Java Cryptographic
Engine (or JCE)). Один из них, a именно SUN JCE^ входит в стан­
дартный пакет Java 1.4. Однако версия SUN JCE в Интернете пред­
ставлена не полностью. Поэтому в наших примерах мы используем
Cryptix JCE^ доступный по адресу www.cryptix.org.
Этот пакет совместим с SUN JCE и поддерживает большое число
криптографических алгоритмов, о которых мы даже не упомина­
ли в этой книге. Кроме того, он легкодоступен через Интернет и
распространяется свободно.
Мы не приводим программ ^щя фактически реализованных алго­
ритмов — RSA, DSA и т. д. Мы просто показываем, как Вы можете
использовать их, когда их реализует другой программист, следуя
стандартам API, Вам, однако, стоит самостоятельно попытаться
запрограммировать свои собственные версии RSA и т.д., посколь­
ку это ведет к лучшему пониманию их специфических свойств.
Все примеры программ используют следующую функцию, кото­
рая преобразует массив байтов в строку их шестнадцатеричного
пр ед ставления:
s t a t i c String To_Hex(byte[] bs)
{ StringBuffer s t r = new StringBufferO ;
f o r ( i n t i=0; i < b s . l e n g t h ; i++)
{ String b = Integer.toHexString(bs[i]);
i f (b.lengthO < 2) b = "0" + b;
str.append( b.substring(b . l e n g t h ( ) - 2 ) ) ;
}
return s t r . t o S t r i n g O ;
}
490 Прилодюение Б. Примеры на языке Java

Б. I. Блочные шифры
Сначала мы покажем, как пользоваться DES^ утроенным DES (на­
зываемым DESede в Java) и Rijndael с помош;ью Cryptix JCE. Следу-
юп1;ая программа показывает, как генерируются ключи и как мож­
но применять различные режимы шифрования, в том числе СВС и
ЕСВ,
Прежде всего необходимо остановиться на каком-то конкретном
типе шифруюш;его алгоритма, например, DES^ режиме шифрования
{СВС) и дополняюш;ей системы. Дополняющая система, использую­
щаяся в программе, приведенной ниже, называется PKCS 5, Она
определена в пятых стандартах криптографии с открытым клю­
чом, опубликованных лабораториями RSA (Public Key Cryptography
Standards), откуда и берется аббревиатура.
Заметим, что изучив, как используется один блочный шифр. Вы
будете знать, как применяются они все.

import Java.security.*;
import javax.crypto.*;
import j avax.crypto.spec.*;
import javax.crypto.interfaces.*;

import c r y p t i x . j c e . p r o v i d e r . C r y p t i x C r y p t o ;

p u b l i c c l a s s SymmetricJ)emo
{
/* Заметьте, что это не зависит от алгоритма */
static void Encrypt(String Alg,String Mode,String Padding)
throws NoSuchAlgorithmException,
InvalidKeyException,
IllegalBlockSizeException,
NoSuchPaddingException,
BadPaddingException,
InvalidAlgorithmParameterException,
NoSuchProviderException
{ System.out.println("\nDemo of "+Alg+" "+Mode+" "+Padding);
KeyGenerator keygen = KeyGenerator.getlnstance(Alg);
if (Alg.equals("DES")) { keygen.init(56); }
else if (Alg.equalsC'Rijndael")) { keygen.init(128); }
else { keygen.init(168); }
SecretKey sKey = keygen.generateKeyO ;
Б.1. Блочные шифры 49

Cipher cipher;
// Create the cipher
cipher = Cipher.getlnstance(Alg+"/"+Mode+"/"+Padding);

// Initialize the cipher for encryption
IvParameterSpec spec = null;
if (Mode.equals("CBC"))
{ SecureRandom sr=new SecureRandomO ;
byte[] iv=new byte[cipher.getBlockSize()];
sr.nextBytes(iv);
spec=new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, sKey, spec);
}
else
{ cipher.init(Cipher.ENCRYPT ЛОВЕ, sKey); }

// Our cleartext

byte[] cleartext = "This is just an example" .getBytesO ;

System.out.println("PlainText : "+To_Hex(cleartext));

// Encrypt the cleartext
byte[] ciphertext = cipher.doFinal(cleartext);
System.out.printIn("CipherText : "+To_Hex(ciphertext));
// Initialize the same cipher for decryption
if (Mode.equals("CBC"))
{ cipher.init(Cipher.DECRYPT_MODE, sKey, spec); }
else
{ сipher.init(Cipher.DECRYPT_MODE, sKey) ; }
// Decrypt the ciphertext
byte[] cleartextl = cipher.doFinal(ciphertext);
System.out .printIn("DecryptedText : "+To_Hex(cleartextl)) ;
}
public static void main(String[] args)
throws NoSuchAlgorithmException,
NoSuchProviderException,
InvalidAlgorithmParameterException,
InvalidKeyException,
InvalidKeyException,
IllegalBlockSizeException,
492 Приложение Б. Примеры на языке Java

NoSuchPaddingException,
BadPaddingException
{
Provider c_jce = new CryptixCryptoO ;
int result = Security.addProvider(c_jce);
if (result==-l)
{ System.out.printlnC'Provider already exists.\n"); }
else
{ System.out.printlnC'Provider added.\n"); }
// ECB Mode
Encrypt("DES","ECB","PKCSSPadding");
Encrypt("DESede","ECB","PKCSSPadding");
Encrypt("Rijndael","ECB","PKCSSPadding");

// CBC Mode
Encrypt("DES","CBC","PKCSSPadding");
EncryptC'DESede","CBC","PKCSSPadding");
Encrypt("Rij ndael","CBC","PKCSSPadding");
}
}


Б.2. Шифрование с открытым ключом
Следующая программа демонстрирует, как можно с помощью Сгур-
tix JCE осуществить шифрование в алгоритмах RSA и Эль-Гамаль.
Обратите внимание на то, насколько она похожа на программу из
предыдущего параграфа. Шифрование будет происходить в режиме
ЕСВ^ а в качестве дополняющей системы выбрана PKCS 1.

import Java.security.*;
import javax.crypto.*;

import cryptix.jce.provi der.CryptixCrypto;

public class Assymetric-Demo
{
/* Обратите внимание как это не зависит от алгоритма */
static void Encrypt (String Alg, String Mode, String Padding)
throws NoSuchAlgorithmException,
InvalidKeyException,
Б,2. Шифрование с открытым ключом 493

IllegalBlockSizeException,
NoSuchPaddingException,
BadPaddingException,
InvalidAlgorithmParameterException,
NoSuchProviderException
{ System.out.println("\nDemo of "+Alg+" "+Mode+" "+Padding);

KeyPairGenerator Kgen = KeyPairGenerator.getlnstance(Alg) ;
Kgen.initialize(512);

KeyPair kpair = Kgen.generateKeyPairO ;

Cipher cipher;

// Create the cipher
cipher = Cipher.getlnstance(Alg+'7"+Mode+'7"+Padding);

// Initialize the cipher for encryption
cipher.init(Cipher.ENCRYPT_MODE, kpair.getPubli c O ) ;

// Our cleartext

byte[] cleartext = "This is just an example" .getBytesO ;

System.out.printIn("PlainText: "+ТоЛех(cleartext));

// Encrypt the cleartext
byte[] ciphertext = cipher.doFinal(cleartext);
System.out.printIn("CipherText: " +ToЛех(ciphertext));
cipher.init(Cipher.DECRYPT_MODE, kpair.getPrivateO) ;

// Decrypt the ciphertext
byte[3 cleartextl = cipher.doFinal(ciphertext);

System.out.printIn("DecryptedText: "+To_Hex(cleartextl));
}

public static void main(String[] args)
throws NoSuchAlgorithmException,
NoSuchProviderException,
494 Прилооюение Б. Примеры на языке Java

InvalidAlgorithmParameterException,
InvalidKeyException,
InvalidKeyException,
IllegalBlockSizeException,
NoSuchPaddingException,
BadPaddingException
{
Provider c_jce = new CryptixCryptoO ;
int result = Security.addProvider(c_jce) ;
if (result==-l)
{ System.out.printIn("Provider already exists.\n"); }
else
{ System.out.print"In("Provider added.\n"); }

Encrypt("ElGamal","ECB","PKCS#1");
Encrypt("RSA","ECB","PKCS#1");
}
}


Б.З. Хэш-функции
Здесь мы показываем, как можно применять хэш-функции, исполь­
зуя стандартную библиотеку Java^ встроенную в Java JDK^ т.е. не
обращаясь к J СЕ, В программе объясняется, как можно вызывать

<< Предыдущая

стр. 75
(из 82 стр.)

ОГЛАВЛЕНИЕ

Следующая >>