Статус: Новичок
Группы: Участники
Зарегистрирован: 20.02.2018(UTC) Сообщений: 3 Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Добрый день! Не удётся получить положительный результат выполнения Вашего примера ("jcp-2.0.39442\examples\userSamples\SessionEncrypt.java") Для демонстрации проблемы сделан отдельный проект, во вложении с краткой инструкцией в READ.ME (https://1drv.ms/u/s!AsIDkB3Kz2LHdRptm9eqItNni6g). При запуске получаем разницу в исходных данных с данными, которые были сначала зашифрованы, потом расшифрованы. Цель – успешное ассиметричное зашифровывание данных открытым ключом получателя, и расшифрование закрытым ключом получателя. Большая просьба помочь разобраться, что мы делаем не так. Спасибо. https://1drv.ms/u/s!AsIDkB3Kz2LHdRptm9eqItNni6g Цитата: package ru.okta;
import javax.crypto.Cipher; import javax.crypto.KeyAgreement; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import java.security.KeyStore; import java.security.PrivateKey; import java.security.SecureRandom; import java.security.cert.Certificate;
public class Main { /** * текст */ private static final String SAMPLE_TEXT = "Classic encryption/decryption"; /** * длина вектора */ private static final int RND_LENGTH = 8; /** * Алгоритм шифрования */ private static final String CIPHER_ALG = "GOST28147/CFB/NoPadding"; /** * датчик случайных чисел: "CPRandom" или JCP.CP_RANDOM */ public static final String RANDOM_ALG = "CPRandom"; /** * алгоритм ключа обмена: "GOST3410DH" или JCP.GOST_DH_NAME */ public static final String EXCH_KEY_PAIR_ALG = "GOST3410DH_2012_256"; /** * алгоритм шифрования ГОСТ 28147-89: "GOST28147" или CryptoProvider.GOST_CIPHER_NAME */ public static final String CHIPHER_ALG = "GOST28147";
public static void main(String[] args) throws Exception { final byte[] data = SAMPLE_TEXT.getBytes(); /**На каждой стороне должны присутствовать: * - свой закрытый ключ * - открытый ключ второй стороны (сертификат)**/
//Container store KeyStore keyStore = KeyStore.getInstance("HDImageStore", "JCP"); keyStore.load(null, null);
final PrivateKey alisaPrivate = (PrivateKey) keyStore.getKey("OktaTest", null); final PrivateKey bobPrivate = (PrivateKey) keyStore.getKey("OktaTest2", null); final Certificate alisaCert = keyStore.getCertificate("OktaTest"); final Certificate bobCert = keyStore.getCertificate("OktaTest2");
/* Генерирование начальной синхропосылки для выработки ключа согласования*/ final byte[] sv = new byte[RND_LENGTH]; final SecureRandom random = SecureRandom.getInstance(RANDOM_ALG); random.nextBytes(sv); final IvParameterSpec ivspec = new IvParameterSpec(sv);
/* Выработка ключа согласования алисы c SV*/ final KeyAgreement alisaKeyAgree = KeyAgreement.getInstance(EXCH_KEY_PAIR_ALG); alisaKeyAgree.init(alisaPrivate, ivspec, null); alisaKeyAgree.doPhase(bobCert.getPublicKey(), true); final SecretKey alisaAgree = alisaKeyAgree.generateSecret(CHIPHER_ALG);
/* Генерирование симметричного ключа алисой с параметрами шифрования из контрольной панели*/ final KeyGenerator keyGen = KeyGenerator.getInstance(CHIPHER_ALG); final SecretKey simm = keyGen.generateKey();
/* Зашифрование текста на симметричном ключе алисы*/ Cipher cipher = Cipher.getInstance(CIPHER_ALG); cipher.init(Cipher.ENCRYPT_MODE, simm); // передача вектора инициализации бобу final byte[] iv = cipher.getIV(); final byte[] encryptedtext = cipher.doFinal(data, 0, data.length);
/*Зашифрование симметричного ключа на ключе согласования алисы*/ cipher.init(Cipher.WRAP_MODE, alisaAgree); final byte[] wrappedKey = cipher.wrap(simm);
/* Выработка ключа согласования боба с тем же SV. */ final KeyAgreement bobKeyAgree = KeyAgreement.getInstance(EXCH_KEY_PAIR_ALG); bobKeyAgree.init(bobPrivate, ivspec, null); bobKeyAgree.doPhase(alisaCert.getPublicKey(), true); final SecretKey bobAgree = bobKeyAgree.generateSecret(CHIPHER_ALG);
/* Расшифрование бобом симметричного ключа.*/ cipher.init(Cipher.UNWRAP_MODE, bobAgree); final SecretKey simmKey = (SecretKey) cipher .unwrap(wrappedKey, null, Cipher.SECRET_KEY);
/* Расшифрование бобом текста на расшифрованном симметричном ключе. IV передан от алисы*/ cipher = Cipher.getInstance(CIPHER_ALG); cipher.init(Cipher.DECRYPT_MODE, simmKey, new IvParameterSpec(iv), null); final byte[] decryptedtext = cipher .doFinal(encryptedtext, 0, encryptedtext.length);
// проверка результата. if (decryptedtext.length != data.length) throw new Exception("Error in crypting"); for (int i = 0; i < decryptedtext.length; i++) if (data[i] != decryptedtext[i]) { throw new Exception(String.format("Error in crypting, enc: \"%s\" != decr: \"%s\"", new String(data), new String(decryptedtext))); }
System.out.println("OK"); } }
Проблема в том, что если зашифровать текст, потом расшифровать, то он "портится", и не совпадает с оригиналом. Отредактировано пользователем 21 февраля 2018 г. 12:23:39(UTC)
| Причина: Не указана
|