Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Встроенные алгоритмы шифрования. 
:(
    Опции темы
NURMS
Дата 17.8.2009, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Привет.

Мне нужно зашифровать некоторый string в C# и расшифровать в Java и наоборот. Есть ли классы шифрования в Java аналог которых имеются также и в С#? Вот в C# уже есть класс Rijndael, мне нужен точно такой же в Java.
PM MAIL   Вверх
NURMS
Дата 17.8.2009, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Вот к примеру сделать на Java такое:

Код


using System;
using System.IO;
using System.Text;
using System.Security.Cryptography;

...

private string XmlPost = "Data to encrypt";

public string EncryptData()
        {
            string plainText = XmlPost;
            string passPhrase = "Pas5pr@se";
            string saltValue = "s@1tValue";
            string hashAlgorithm = "MD5";
            int passwordIterations = 2;
            string initVector = "@1B2c3D4e5F6g7H8";
            int keySize = 256;

            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);
            byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);

            PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                        passPhrase,
                                                        saltValueBytes,
                                                        hashAlgorithm,
                                                        passwordIterations);

            byte[] keyBytes = password.GetBytes(keySize / 8);
            RijndaelManaged symmetricKey = new RijndaelManaged();
            symmetricKey.Mode = CipherMode.CBC;

            ICryptoTransform encryptor = symmetricKey.CreateEncryptor(
                                                         keyBytes,
                                                         initVectorBytes);

            MemoryStream memoryStream = new MemoryStream();
            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                     encryptor,
                                                     CryptoStreamMode.Write);

            cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
            cryptoStream.FlushFinalBlock();
            byte[] cipherTextBytes = memoryStream.ToArray();
            memoryStream.Close();
            cryptoStream.Close();
            string cipherText = Convert.ToBase64String(cipherTextBytes);

            XmlPost = cipherText;

            return "Data to encript : " + cipherText;
        }

        public string DecryptData()
        {
            string cipherText = XmlPost;
            string passPhrase = "Pas5pr@se";
            string saltValue = "s@1tValue";
            string hashAlgorithm = "MD5";
            int passwordIterations = 2;
            string initVector = "@1B2c3D4e5F6g7H8";
            int keySize = 256;

            byte[] initVectorBytes = Encoding.ASCII.GetBytes(initVector);
            byte[] saltValueBytes = Encoding.ASCII.GetBytes(saltValue);

            byte[] cipherTextBytes = Convert.FromBase64String(cipherText);

            PasswordDeriveBytes password = new PasswordDeriveBytes(
                                                        passPhrase,
                                                        saltValueBytes,
                                                        hashAlgorithm,
                                                        passwordIterations);

            byte[] keyBytes = password.GetBytes(keySize / 8);

            RijndaelManaged symmetricKey = new RijndaelManaged();
            symmetricKey.Mode = CipherMode.CBC;

            ICryptoTransform decryptor = symmetricKey.CreateDecryptor(
                                                         keyBytes,
                                                         initVectorBytes);

            MemoryStream memoryStream = new MemoryStream(cipherTextBytes);

            CryptoStream cryptoStream = new CryptoStream(memoryStream,
                                                      decryptor,
                                                      CryptoStreamMode.Read);

            byte[] plainTextBytes = new byte[cipherTextBytes.Length];

            int decryptedByteCount = cryptoStream.Read(plainTextBytes,
                                                   0,
                                                   plainTextBytes.Length);

            memoryStream.Close();
            cryptoStream.Close();

            string plainText = Encoding.UTF8.GetString(plainTextBytes,
                                                   0,
                                                   decryptedByteCount);

            return plainText;
        }

PM MAIL   Вверх
FreakOnALeash
Дата 18.8.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.12.2007

Репутация: нет
Всего: нет



Занимаюсь тем же smile 
Код

 private SecretKeySpec key;
 private IvParameterSpec iv;
private byte[] output;

            // ф-ия concatGuid и decodeHexString мои, смысл в том, что последовательность байт преобразуется в ключ, то есть Вам надо в С# сгенерить из ключа 
            //последовательность байт и просто передать ее в  Java
            // то же самое и с иниц. вектором
            key = new SecretKeySpec(concatGuid(decodeHexString(guid.toClearString()),decodeHexString(enc.toClearString())), "AES");
            byte[] ivektor = decodeHexString(guid.toClearString());
            iv = new IvParameterSpec(ivektor);
 

            Cipher c1 = Cipher.getInstance("AES/CBC/NOPADDING");
            c1.init(Cipher.DECRYPT_MODE, key,iv);
            output = c1.doFinal(content.getBytes());


Код не полный, если будут вопросы - спрашивайте. AES соответствует Риандел (если интересно - читайте википедию ) 

Как Вы уже заметили, принцип слегка иной, для расшифровки любого сообщения нам надо создать объект Cipher, отличатся будут только параметры, которые мы ему задаем. Думаю про него Вам будет интересно почитать тут

Это сообщение отредактировал(а) FreakOnALeash - 18.8.2009, 15:02
PM MAIL   Вверх
NURMS
Дата 20.8.2009, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Вот написал что-то такое, но выдаёт вот такую ошибку:

Exception in thread "main" javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes
    at com.sun.crypto.provider.SunJCE_f.a(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.AESCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
    at Main.main(Main.java:23)

И мне ещё нужно зашифрованное сообщение переделать в string для передачи. При использовании этого Base64 дешифровке уже не поддаётся.

Код

import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;

import com.sun.org.apache.xml.internal.security.utils.Base64;
 
public class Main { 
  
    public static void main(String[] args) throws Exception {
        
        byte[] TextToEncrypt = "aaaaaaaaaaaaaaaa".getBytes();
        
        byte[] AES_KEY = "1111111111111111".getBytes();
        byte[] AES_IV = "1111111111111111".getBytes();
        
        Cipher EncryptionCifer = Cipher.getInstance("AES/CBC/NoPadding");
        
        SecretKeySpec SKS = new SecretKeySpec(AES_KEY, "AES");
        IvParameterSpec IPS = new IvParameterSpec(AES_IV);
        
        EncryptionCifer.init(Cipher.ENCRYPT_MODE, SKS, IPS);

        byte[] Encrypted = EncryptionCifer.doFinal(TextToEncrypt);
        
        String Encryption = Base64.encode(Encrypted);
        
        System.out.println(Encryption);
    }
}


Добавлено через 3 минуты и 4 секунды
Нет, так делает вид, что работает, но это беспредел:

Код

byte[] TextToEncrypt = "aaaaaaaaaaaaaaaa".getBytes();


А выдаёт ошибку когда:

Код

byte[] TextToEncrypt = "AAA".getBytes();

PM MAIL   Вверх
NURMS
Дата 20.8.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Так, с Base64 разобрался!! Его использовать не буду. Действительно легче как String перевести в 16 - ичные. Остаётся всё остальное!!
PM MAIL   Вверх
NURMS
Дата 20.8.2009, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 20.4.2007

Репутация: нет
Всего: нет



Как я понял, мне придётся добавлять нулевые байты, если длина текста не будет кратной 16?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0450 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.