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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Bouncy Castle Crypto APIs 
:(
    Опции темы
VOS
Дата 17.8.2007, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Положение 
о лицензировании деятельности по распространению шифровальных (криптографических) средств 
(утв. постановлением Правительства РФ от 23 сентября 2002 г. N 691)

...

3. Настоящее Положение не распространяется на деятельность по распространению: 
      а) шифровальных (криптографических) средств, являющихся компонентами доступных для продажи без ограничений посредством розничной торговли, либо сделок по почтовым запросам, либо электронных сделок, либо сделок по телефонным заказам программных операционных систем, криптографические возможности которых не могут быть изменены пользователями, которые разработаны для установки пользователем самостоятельно без дальнейшей существенной поддержки поставщиком и техническая документация (описание алгоритмов криптографических преобразований, протоколы взаимодействия, описание интерфейсов и т.д.) на которые является доступной, в том числе для проверки; 
      б) персональных кредитных карточек со встроенной микроЭВМ, криптографические возможности которых не могут быть изменены пользователями; 
      в) портативных или мобильных радиотелефонов гражданского назначения (типа радиотелефонов, предназначенных для использования в коммерческих гражданских системах сотовой радиосвязи), которые не имеют функции сквозного шифрования; 
      г) приемной аппаратуры радиовещания, коммерческого телевидения или иной аппаратуры коммерческого типа для вещания на ограниченную аудиторию без шифрования цифрового сигнала, в которой шифрование ограничено функциями управления видео- или аудиоканалами; 
      д) специально разработанных и применяемых только для банковских и финансовых операций шифровальных (криптографических) средств в составе терминалов единичной продажи (банкоматов), криптографические возможности которых не могут быть изменены пользователями;
      е) специально разработанных и применяемых только в составе контрольно-кассовых машин шифровальных (криптографических) средств защиты фискальной памяти; 
 ж) шифровальных (криптографических) средств независимо от их назначения, реализующих симметричные криптографические алгоритмы и обладающих максимальной длиной криптографического ключа менее 40 бит, а также реализующих асимметричные криптографические алгоритмы, основанные либо на разложении на множители целых чисел, либо на вычислении дискретных логарифмов в мультипликативной группе конечного поля, либо на дискретном логарифме в группе, отличной от названной, и обладающих максимальной длиной криптографического ключа 128 бит. 


По второму пункту есть определенные требования  ФСБ предъявляемые к системам по разным классам защиты КС1 и т.д. Они в свою очередь руководствуются ГОСТ 'ами. 

При этом надо различать понятия лицензирования и сертификации. Лицензируется деятельность, т.е. лицензии выдаются организации, а сертифицируется продукт. 
Вообще рекомендую с юристами проконсультироваться по этому поводу.

Добавлено через 10 минут и 54 секунды
ZedroXyMur
По обсфукатору Вам в личку письмо отправил.
PM MAIL   Вверх
ZedroXyMur
Дата 20.8.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за советы!
Знач вот что нужно сделать, что бы заработала либа с сорсами (а не с уже откомпилеными классами):  smile 

1) Удалить данные папки:
lcrypto-j2me-137\src\java\math\test
lcrypto-j2me-137\src\org\bouncycastle\asn1\test
lcrypto-j2me-137\src\org\bouncycastle\crypto\examples
lcrypto-j2me-137\src\org\bouncycastle\crypto\test
lcrypto-j2me-137\src\org\bouncycastle\util\test

2) Нужно переименовать все классы, которые лежат в lcrypto-j2me-137\src\java т.к. это зарезервированое название пакета. И его нельзя испольвовать в j2me. В NetBeans есть функция: Refractor->Move Class. С помощью нее можно это все сделать не переименовывая классы вручную.

На этом как бы все.  smile  Мидлет откомпилился и все ОК, тока пару нотов выкидывает:

Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

НО! бага с обфускатором остается:

Warning: org.bouncycastle.math.ec.IntArray: can't find referenced method 'java.lang.Object clone()' in class java.lang.Object
Warning: there were 1 unresolved references to program class members.
Your input classes appear to be inconsistent.
You may need to recompile them and try again.
Alternatively, you may have to specify the options 
'-dontskipnonpubliclibraryclasses' and/or
'-dontskipnonpubliclibraryclassmembers'.
If you are sure the mentioned classes are not used anyway,
you could try your luck using the '-ignorewarnings' option.
Error: Please correct the above warnings first.
C:\Work\j2me\Rupay Mobile\nbproject\build-impl.xml:260: Obfuscation failed with error code 1

Помогите кто может.
Настройки обфуската:

-dontusemixedcaseclassnames
-defaultpackage ''
-overloadaggressively
-keep public class ** extends javax.microedition.midlet.MIDlet {
public *;
}

+

Может кто то дать пример реализации RSA шифрования под Bouncy Castle?   smile 
PM MAIL   Вверх
ZedroXyMur
Дата 20.8.2007, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот мидлет с рабочей либой: http://www.intercourier.com.ua/uploads/lcryptoTest1.zip
Кто может, посмотрите, почему обфускатор матерится  smile 
PM MAIL   Вверх
ZedroXyMur
Дата 21.8.2007, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Рабочие примеры реализации алгоритмов - AES, DES, RSA :
Код

import java.io.*;
import java.math.*;
import java.security.*;

import org.bouncycastle.crypto.*;
import org.bouncycastle.crypto.params.*;
import org.bouncycastle.crypto.engines.*;
import org.bouncycastle.crypto.encodings.*;
import org.bouncycastle.crypto.generators.*;
import org.bouncycastle.crypto.modes.*;
import org.bouncycastle.crypto.paddings.*;
import org.bouncycastle.crypto.digests.*;
import org.bouncycastle.crypto.signers.*;

public class CryptoEngine {

  private byte [] AESkey;
  private byte [] AESinitV;

  private byte [] salt;

  private RSAKeyParameters RSAprivKey;
  private RSAKeyParameters RSApubKey;

  public CryptoEngine () {
    try {
      Class c = this.getClass();
      InputStream is;

      is = c.getResourceAsStream("/keys/AESkey.dat");
      AESkey = readFromStream(is);
      is.close();
      is = c.getResourceAsStream("/keys/AESinitV.dat");
      AESinitV = readFromStream(is);
      is.close();

      SecureRandom sr = new SecureRandom();
      salt = new byte [16];
      sr.nextBytes(salt);

      is = c.getResourceAsStream("/keys/RSAmod.dat");
      BigInteger RSAmod = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSAprivExp.dat");
      BigInteger RSAprivExp = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSApubExp.dat");
      BigInteger RSApubExp = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSAdp.dat");
      BigInteger RSAdp = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSAdq.dat");
      BigInteger RSAdq = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSAp.dat");
      BigInteger RSAp = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSAq.dat");
      BigInteger RSAq = new BigInteger(readFromStream(is));
      is.close();
      is = c.getResourceAsStream("/keys/RSAqInv.dat");
      BigInteger RSAqInv = new BigInteger(readFromStream(is));
      is.close();

      RSAprivKey = new RSAPrivateCrtKeyParameters(RSAmod, RSApubExp,
                        RSAprivExp, RSAp, RSAq, RSAdp, RSAdq, RSAqInv);
      RSApubKey = new RSAKeyParameters(false, RSAmod, RSApubExp);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return;
  }

  public void generateAESKey () throws Exception {
    SecureRandom sr = new SecureRandom();
    AESkey = new byte [16];
    sr.nextBytes(AESkey);
    AESinitV = new byte [16];
    sr.nextBytes(AESinitV);
  }

  public void generateRSAKeyPair () throws Exception {
    SecureRandom sr = new SecureRandom();
    BigInteger pubExp = new BigInteger("10001", 16);
    RSAKeyGenerationParameters RSAKeyGenPara =
         new RSAKeyGenerationParameters(pubExp, sr, 1024, 80);
    RSAKeyPairGenerator RSAKeyPairGen = new RSAKeyPairGenerator();
    RSAKeyPairGen.init(RSAKeyGenPara);
    AsymmetricCipherKeyPair keyPair = RSAKeyPairGen.generateKeyPair();

    RSAprivKey = (RSAPrivateCrtKeyParameters) keyPair.getPrivate();
    RSApubKey = (RSAKeyParameters) keyPair.getPublic();
  }

  public byte [] AESLiteEncrypt (byte [] toEncrypt) throws Exception {
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new AESLightEngine()));
    // If initV is not given, the program will assume all zeros
    ParametersWithIV piv = new ParametersWithIV (
                      (new KeyParameter(AESkey)), AESinitV);
    cipher.init(true, piv);
    byte[] result = new byte[cipher.getOutputSize(toEncrypt.length)];
    int len = cipher.processBytes(toEncrypt, 0, toEncrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  public byte [] AESLiteDecrypt (byte [] toDecrypt) throws Exception {
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new AESLightEngine()));
    ParametersWithIV piv = new ParametersWithIV (
                      (new KeyParameter(AESkey)), AESinitV);
    cipher.init(false, piv);
    byte[] result = new byte[cipher.getOutputSize(toDecrypt.length)];
    int len = cipher.processBytes(toDecrypt, 0, toDecrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  public byte [] AESFastEncrypt (byte [] toEncrypt) throws Exception {
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new AESFastEngine()));
    // If initV is not given, the program will assume all zeros
    ParametersWithIV piv = new ParametersWithIV (
                      (new KeyParameter(AESkey)), AESinitV);
    cipher.init(true, piv);
    byte[] result = new byte[cipher.getOutputSize(toEncrypt.length)];
    int len = cipher.processBytes(toEncrypt, 0, toEncrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  public byte [] AESFastDecrypt (byte [] toDecrypt) throws Exception {
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new AESFastEngine()));
    ParametersWithIV piv = new ParametersWithIV (
                      (new KeyParameter(AESkey)), AESinitV);
    cipher.init(false, piv);
    byte[] result = new byte[cipher.getOutputSize(toDecrypt.length)];
    int len = cipher.processBytes(toDecrypt, 0, toDecrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  // Get use password to generate symmetric key with (or without IV)
  // To be used in an AES underlying cipher
  private CipherParameters getAESPasswdKey (char [] passwd) throws Exception {
    PBEParametersGenerator  generator =
        new PKCS12ParametersGenerator(new SHA1Digest());
    generator.init(
        PBEParametersGenerator.PKCS12PasswordToBytes(passwd),
        salt, 1024);
    // Generate a 128 bit key w/ 128 bit IV
    ParametersWithIV key =
      (ParametersWithIV)generator.generateDerivedParameters(128, 128);
    // Generate a 128 kit key
    // CipherParameters key = generator.generateDerivedParameters(128);
    return key;
  }

  // Password based encryption using AES
  public byte [] AESPasswdEncrypt (byte [] toEncrypt, char [] passwd)
                                       throws Exception {
    ParametersWithIV key = (ParametersWithIV) getAESPasswdKey(passwd);
    // The following code uses an AES cipher to
    // encrypt the message
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new AESFastEngine()));
    cipher.init(true, key);
    byte[] result = new byte[cipher.getOutputSize(toEncrypt.length)];
    int len = cipher.processBytes(toEncrypt, 0, toEncrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  // Password based decryption using AES
  public byte [] AESPasswdDecrypt (byte [] toDecrypt, char [] passwd)
                                       throws Exception {
    ParametersWithIV key = (ParametersWithIV) getAESPasswdKey(passwd);
    // The following code uses an AES cipher to
    // decrypt the message
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new AESFastEngine()));
    cipher.init(false, key);
    byte[] result = new byte[cipher.getOutputSize(toDecrypt.length)];
    int len = cipher.processBytes(toDecrypt, 0, toDecrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  // Get use password to generate a triple DES symmetric key
  private DESedeParameters getDESedePasswdKey (char [] passwd)
                                              throws Exception {
    PBEParametersGenerator  generator =
        new PKCS12ParametersGenerator(new SHA1Digest());
    generator.init(
        PBEParametersGenerator.PKCS12PasswordToBytes(passwd),
        salt, 1);
    KeyParameter rawKey =
      (KeyParameter) generator.generateDerivedParameters(128);
    byte [] keyBytes = rawKey.getKey();
    DESedeParameters.setOddParity(keyBytes);
    DESedeParameters key = new DESedeParameters(keyBytes);
    return key;
  }

  // Password based encryption using DESede
  public byte [] DESedePasswdEncrypt (byte [] toEncrypt, char [] passwd)
                                       throws Exception {
    DESedeParameters key = (DESedeParameters) getDESedePasswdKey(passwd);
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new DESedeEngine()));
    cipher.init(true, key);
    byte[] result = new byte[cipher.getOutputSize(toEncrypt.length)];
    int len = cipher.processBytes(toEncrypt, 0, toEncrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  // Password based decryption using DESede
  public byte [] DESedePasswdDecrypt (byte [] toDecrypt, char [] passwd)
                                       throws Exception {
    DESedeParameters key = (DESedeParameters) getDESedePasswdKey(passwd);
    BufferedBlockCipher cipher =
             new PaddedBufferedBlockCipher(
               new CBCBlockCipher(new DESedeEngine()));
    cipher.init(false, key);
    byte[] result = new byte[cipher.getOutputSize(toDecrypt.length)];
    int len = cipher.processBytes(toDecrypt, 0, toDecrypt.length, result, 0);
    try {
      cipher.doFinal(result, len);
    } catch (CryptoException ce) {
      result = (new String("Cipher error")).getBytes();
      ce.printStackTrace();
    }
    return result;
  }

  // Public key encrypt using RSA
  public byte [] RSAEncrypt (byte [] toEncrypt) throws Exception {
    if (RSApubKey == null)
      throw new Exception("Generate RSA keys first!");

    AsymmetricBlockCipher eng = new RSAEngine();
    eng = new PKCS1Encoding(eng);
    eng.init(true, RSApubKey);
    return eng.processBlock(toEncrypt, 0, toEncrypt.length);
  }

  // private key decrypt
  public byte [] RSADecrypt (byte [] toDecrypt) throws Exception {
    if (RSAprivKey == null)
      throw new Exception("Generate RSA keys first!");

    AsymmetricBlockCipher eng = new RSAEngine();
    eng = new PKCS1Encoding(eng);
    eng.init(false, RSAprivKey);
    return eng.processBlock(toDecrypt, 0, toDecrypt.length);
  }

  // RSA signature
  public byte [] RSASign (byte [] toSign) throws Exception {
    if (RSAprivKey == null)
      throw new Exception("Generate RSA keys first!");
    SHA1Digest dig = new SHA1Digest();
    RSAEngine eng = new RSAEngine();

    PSSSigner signer = new PSSSigner(eng, dig, 64);
    signer.init(true, RSAprivKey);
    signer.update(toSign, 0, toSign.length);
    return signer.generateSignature();
  }

  // RSA signature verification
  public boolean RSAVerify (byte [] mesg, byte [] sig) throws Exception {
    if (RSApubKey == null)
      throw new Exception("Generate RSA keys first!");
    SHA1Digest dig = new SHA1Digest();
    RSAEngine eng = new RSAEngine();

    PSSSigner signer = new PSSSigner(eng, dig, 64);
    signer.init(false, RSApubKey);
    signer.update(mesg, 0, mesg.length);
    return signer.verifySignature(sig);
  }

  private byte [] readFromStream (InputStream is) throws Exception {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte [] b = new byte[1];
    while ( is.read(b) != -1 ) {
       baos.write(b);
    }
    byte[] result = baos.toByteArray();
    baos.close();
    return result;
  }

}


Добавлено @ 16:15
Рабочие примеры реализации алгоритмов - DES/DESede, IDEA, AES (Rijndael), Twofish :

Код

package org.bouncycastle.crypto.examples;

import java.io.*;
import java.lang.*;

import javax.microedition.midlet.MIDlet;
import javax.microedition.lcdui.*;

import org.bouncycastle.util.test.*;
import org.bouncycastle.util.encoders.*;

import org.bouncycastle.crypto.*;
import org.bouncycastle.crypto.paddings.*;
import org.bouncycastle.crypto.engines.*;
import org.bouncycastle.crypto.modes.*;
import org.bouncycastle.crypto.params.*;

/**
 * MIDP is a simple graphics application for the J2ME CLDC/MIDP.
 * 
 * It has hardcoded values for the key and plain text. It also performs the
 * standard testing for the chosen cipher, and displays the results.
 * 
 * This example shows how to use the light-weight API and a symmetric cipher.
 * 
 */
public class MIDPTest extends MIDlet
{
    private Display             d           = null;

    private boolean             doneEncrypt = false;

    private String              key         = "0123456789abcdef0123456789abcdef";
    private String              plainText   = "www.bouncycastle.org";
    private byte[]              keyBytes    = null;
    private byte[]              cipherText  = null;
    private BufferedBlockCipher cipher      = null;

    private String[]            cipherNames = {"DES", "DESede", "IDEA", "Rijndael", "Twofish"};

    private Form                output      = null;

    public void startApp()
    {
        Display.getDisplay(this).setCurrent(output);
    }

    public void pauseApp()
    {

    }

    public void destroyApp(boolean unconditional)
    {

    }

    public MIDPTest()
    {
        output = new Form("BouncyCastle");
        output.append("Key: " + key.substring(0, 7) + "...\n");
        output.append("In : " + plainText.substring(0, 7) + "...\n");

        cipherText = performEncrypt(Hex.decode(key.getBytes()), plainText);
        String ctS = new String(Hex.encode(cipherText));

        output.append("\nCT : " + ctS.substring(0, 7) + "...\n");

        String decryptText = performDecrypt(Hex.decode(key.getBytes()), cipherText);

        output.append("PT : " + decryptText.substring(0, 7) + "...\n");

        if (decryptText.compareTo(plainText) == 0)
        {
            output.append("Success");
        }
        else
        {
            output.append("Failure");
            message("[" + plainText + "]");
            message("[" + decryptText + "]");
        }

    }

    private final byte[] performEncrypt(byte[] key, String plainText)
    {
        byte[] ptBytes = plainText.getBytes();

        cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(getEngineInstance()));

        String name = cipher.getUnderlyingCipher().getAlgorithmName();
        message("Using " + name);

        cipher.init(true, new KeyParameter(key));

        byte[] rv = new byte[cipher.getOutputSize(ptBytes.length)];

        int oLen = cipher.processBytes(ptBytes, 0, ptBytes.length, rv, 0);
        try
        {
            cipher.doFinal(rv, oLen);
        }
        catch (CryptoException ce)
        {
            message("Ooops, encrypt exception");
            status(ce.toString());
        }
        return rv;
    }

    private final String performDecrypt(byte[] key, byte[] cipherText)
    {
        cipher.init(false, new KeyParameter(key));

        byte[] rv = new byte[cipher.getOutputSize(cipherText.length)];

        int oLen = cipher.processBytes(cipherText, 0, cipherText.length, rv, 0);
        try
        {
            cipher.doFinal(rv, oLen);
        }
        catch (CryptoException ce)
        {
            message("Ooops, decrypt exception");
            status(ce.toString());
        }
        return new String(rv).trim();
    }

    private int whichCipher()
    {
        return 4; // DES
    }

    private final BlockCipher getEngineInstance()
    {
        // returns a block cipher according to the current
        // state of the radio button lists. This is only
        // done prior to encryption.
        BlockCipher rv = null;

        switch (whichCipher())
        {
            case 0 :
                rv = new DESEngine();
                break;
            case 1 :
                rv = new DESedeEngine();
                break;
            case 2 :
                rv = new IDEAEngine();
                break;
            case 3 :
                rv = new RijndaelEngine();
                break;
            case 4 :
                rv = new TwofishEngine();
                break;
            default :
                rv = new DESEngine();
                break;
        }
        return rv;
    }

    public void message(String s)
    {
        System.out.println("M:" + s);
    }

    public void status(String s)
    {
        System.out.println("S:" + s);
    }

}


Это сообщение отредактировал(а) ZedroXyMur - 21.8.2007, 16:16
PM MAIL   Вверх
ZedroXyMur
Дата 21.8.2007, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Рабочие примеры реализации алгоритмов - GOST3411, MD2, MD4, MD5, RIPEMD128, RIPEMD160, RIPEMD256, RIPEMD320, SHA1, SHA224, SHA256, SHA384, SHA512, Tiger, Whirlpool :

Код

  // Encrypt using SHA1
  static public String SHA1_Base64_encode( String mesg ) throws Exception {
    SHA1Digest digEng = new SHA1Digest(); // <- УКАЗЫВАЕМ КАКОЙ АЛГОРИТМ ИСПОЛЬВАТЬ
    byte [] mesgBytes = mesg.getBytes();
    digEng.update( mesgBytes, 0, mesgBytes.length );
    byte [] digest = new byte[digEng.getDigestSize()];
    digEng.doFinal(digest, 0);
    return (new String(Base64.encode(digest)));
  }


Добавлено через 4 минуты и 16 секунд
Отпишите кто знает как открыть сертификат?...

Этот способ почему то глючит.. выкидывает эрроры:
Код

ASN1InputStream aIn = new ASN1InputStream(Hex.decode(key_public)); 
ASN1Sequence encodedSeq = (ASN1Sequence)aIn.readObject(); 
SubjectPublicKeyInfo pkInfo = SubjectPublicKeyInfo.getInstance(encodedSeq); 
RSAPublicKeyStructure pk = RSAPublicKeyStructure.getInstance(pkInfo.getPublicKey()); 
RSAKeyParameters pubParameters = new RSAKeyParameters(false, pk.getModulus(), pk.getPublicExponent());

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


Новичок



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

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



Цитата(ZedroXyMur @ 20.8.2007,  14:56)
Вот мидлет с рабочей либой: http://www.intercourier.com.ua/uploads/lcryptoTest1.zip
Кто может, посмотрите, почему обфускатор матерится  smile

А можно перезалить либу?

А вобще задача связаться с опенссл библиотекой на винде (ДЕЛФИ), там ключи сгенерены как:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3,0D01033A71DCBFA2

laBPkRK45+4XIllC3aQstfH8lRWwcPVvgIcKWIBXX/8vHSC1luGTK6NbKme7W6w5
vbS3AWJyuMUpPR+1NqOJr+XUwC2iYcOiQstaBZqOBq+95mAYR4w6JylO36FIn4Ga
WnhGp5lZEi1mdNAUA6X0umdsEQKnkiSoF27OS3sLwhEy99zKI1kIyEZCjvA3hVMM
EYmxEG5jm4XTPHAfVPPiHhiWbtBM48aTxF0RJvR8rnhV2MLrlc72h769L37nlpjX
JVSLC6bzHmNJ+23F+AbNO5uTPTvkcszAb6JK+G8wL+MaGcddoEyAdkE3OdzkzV7z
l60DJaWyQnhjw3arHv7KQCA3hUeIv6myAX25yeJt41TE7uj+ul/e7/wcgzLGcsq/
LAxvjw/PyaxIImhzH4KDeOlABzovGc3H7FEQCSomA4IqRVRdr56iUUa1D5Iu/XEj
I9ERVhI/XgN+WfMAYLhB4EDupySsxt/bLY7fdEi9v1moeqobhC2ksrdUjwARs0bX
1EeIvR1PJSXZjiNLuqPO3LdyUGAOww8R0oShHAFxCu/6gf2NMLSC42OipGHYQTae
TByRmF+oBmidRvk2pkeOUZm5zQYtLT48ySn50jXK3QCGXLNpVzwiOzh/uveqkjMb
TWfAqEfKm2a4gEqnF3mu5vQ+rJHDAJ780zat3QpYwu15lZy5lldo6MXgugCDhzMw
JX+nc5Bi2Hz6RhjvLJ9jOO3L9MMGw7Vcq0sNeOp+IsApcFAtd3fK4Hdy4qMyydRD
J7JNHQI5Ql+8O1xAUJVcvEAioRNlNz6OH5b7urTU5MTZq2ncADopUw==
-----END RSA PRIVATE KEY-----

-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAOj3avY9u2c7s8DSZvCyjP2ZFZQS51GzSOzYRiXGUU/Sd7TUkb/UHU3t
L9YOP1iz+z7vnb8rwhHuUmexvcyELXjjl0jvEpoEqYZAR8IXI9n71wNFK36ax6zd
g7qrS+Kc6rVcidzraWJrjasvYbuJD6/rYwYCACZcJ6HnmD899y1dAgMBAAE=
-----END RSA PUBLIC KEY-----

Но в j2me bouncycastle нет класа чтения PEM формата.
Мне нужно:
1. Использовать сегнеренные опенссл ключ у себя (крипт, подпись) (RSA, DES-EDE3) (для начала хоты бы как их прочитать чтобы боунсикастл их принял).
2. Генерить ключи для ОпенССЛ и использовать у себя и на стороне опенссл (крипт, подпись) (RSA, DES-EDE3) (для начала, как сгенерить в нужных стандартах  как сохранить в формат понятный опенссл?)

Подскажите, коллеги, куда идти и что копать? Опыта работы с данной либой не имел и пока дже не знаю как ее одолеть... :(


Это сообщение отредактировал(а) JackSoft - 24.2.2008, 18:06
PM MAIL   Вверх
JackSoft
Дата 25.2.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



С чтением приватного ключа из PEM немного прояснилось (но это чтение нешифрованного ключа! как с DES быть пока ума не приложу. Вот код чтения:

Код

private void readPrivRSAKey(String keyIn) throws IOException, NoSuchAlgorithmException
{
 DataInputStream is = new DataInputStream(this.getClass().getResourceAsStream(keyIn));
 byte [] b64encoded = new byte [is.available()];
 is.readFully(b64encoded);
 is.close();
 byte [] asn1PrivateKeyBytes = Base64.decode (b64encoded);

// KeyFactory keyFactory = KeyFactory.getInstance("RSA");
 RSAPrivateKeyStructure rsa = new RSAPrivateKeyStructure((ASN1Sequence)ASN1Sequence.fromByteArray (asn1PrivateKeyBytes));
 
 BigInteger mod = rsa.getModulus ();
 BigInteger pubExp = rsa.getPublicExponent ();
 BigInteger privExp = rsa.getPrivateExponent ();
 BigInteger p1 = rsa.getPrime1 ();
 BigInteger p2 = rsa.getPrime2 ();
 BigInteger exp1 = rsa.getExponent1 ();
 BigInteger exp2 = rsa.getExponent2 ();
 BigInteger crtCoef = rsa.getCoefficient ();
 
 RSAPrivateCrtKeyParameters keySpec = new RSAPrivateCrtKeyParameters(mod, pubExp, privExp, p1, p2, exp1, exp2, crtCoef);
 RSAprivKey = keySpec;
}


такой же фокус для публичного не проходит:
Код


private void readPubRSAKey(String keyIn) throws IOException, NoSuchAlgorithmException
{
 DataInputStream is = new DataInputStream(this.getClass().getResourceAsStream(keyIn));
 byte [] b64encoded = new byte [is.available()];
 is.readFully(b64encoded);
 is.close();
 byte [] asn1PublicKeyBytes = Base64.decode (b64encoded);
 SubjectPublicKeyInfo pkInfo = SubjectPublicKeyInfo.getInstance((ASN1Sequence)ASN1Sequence.fromByteArray (asn1PublicKeyBytes));

 RSAPublicKeyStructure rsa = RSAPublicKeyStructure.getInstance(pkInfo.getPublicKey());
 BigInteger mod = rsa.getModulus ();
 BigInteger pubExp = rsa.getPublicExponent ();
 RSApubKey = new RSAKeyParameters(false, mod, pubExp);
}


Получаем ошибку - неизвестный обьект в фектори... :(

Теперь дальше - шифрование данных больше блока (например для длины ключа 024 - блок 128)
Код


  public byte [] RSAEncrypt (byte [] toEncrypt) throws Exception {
    if (RSApubKey == null)
      throw new Exception("Generate RSA keys first!");
    AsymmetricBlockCipher eng = new RSAEngine();
    eng = new PKCS1Encoding(eng);
    eng.init(true, RSApubKey);
    int blocksize = eng.getInputBlockSize ();
    int blocks = 0;
    if(toEncrypt.length >= blocksize)
    {
      blocks = (int)toEncrypt.length / blocksize;
    }
    int last = toEncrypt.length - blocks*blocksize;
    byte [] tmp = new byte[toEncrypt.length];
    for(int i=0; i<blocks; i++)
    {
      byte [] tmp1 = eng.processBlock(toEncrypt, i*blocksize, blocksize);
      System.arraycopy (tmp1, 0, tmp, i*blocksize, tmp1.length);
    }
    
    byte [] tmp1 = eng.processBlock(toEncrypt, blocks*blocksize, last-1);
    System.arraycopy (tmp1, 0, tmp, blocks*blocksize, tmp1.length);
    return tmp;
  }



Получаем ексепшин:
java.lang.ArrayIndexOutOfBoundsException
        at MB.HelloMidlet.RSAEncrypt(+158)
на последней строке:
    byte [] tmp1 = eng.processBlock(toEncrypt, blocks*blocksize, last-1);


Дайте хоть какой-то ответ... :(
PM MAIL   Вверх
VOS
Дата 26.2.2008, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Если у Вас
 toEncrypt.length == blocks*blocksize то  last==0 

тогда в предпоследней строке будет
eng.processBlock(toEncrypt, blocks*blocksize, -1);

может из-за этого исключения?
PM MAIL   Вверх
JackSoft
Дата 26.2.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот исправленная версия. Даже блок вручную выставил 126 (для 1024 бит он 128).
Тот же ексепшин
Код

 // Public key encrypt using RSA
  public byte [] RSAEncrypt (byte [] toEncrypt) throws Exception {
    if (RSApubKey == null)
      throw new Exception("Generate RSA keys first!");
    AsymmetricBlockCipher eng = new RSAEngine();
//    eng = new OAEPEncoding(eng);
    eng = new PKCS1Encoding(eng);
    eng.init(true, RSApubKey);
    int blocksize = 126;
    int blocks = 0;
    if(toEncrypt.length >= blocksize)
    {
      blocks = (int)toEncrypt.length / blocksize;
    }
    int last = toEncrypt.length - blocks*blocksize;
    byte [] tmp = new byte[toEncrypt.length];
    for(int i=0; i<blocks; i++)
    {
      byte [] tmp1 = eng.processBlock(toEncrypt, i*blocksize, blocksize);
      System.arraycopy (tmp1, 0, tmp, i*blocksize, tmp1.length);
    }
    
    if(last > 0)
    {
      byte [] tmp1 = eng.processBlock(toEncrypt, blocks*blocksize, last);
      System.arraycopy (tmp1, 0, tmp, blocks*blocksize, tmp1.length);
    }
    
    return tmp;
  }


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


Новичок



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

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



И так с криптом разобрался! Вот правильный метод для любой длины:
Код

 public byte [] RSAEncrypt (byte [] toEncrypt) throws Exception {
  
    if (RSApubKey == null)
      throw new Exception("Generate RSA keys first!");
    
    AsymmetricBlockCipher eng = new RSAEngine();
    eng = new PKCS1Encoding(eng);
    eng.init(true, RSApubKey);

    int blocksize = eng.getInputBlockSize ();
    int blocks = 0;
    if(toEncrypt.length >= blocksize)
    {
      blocks = (int)toEncrypt.length / blocksize;
    }
    int last = toEncrypt.length - blocks*blocksize;
    
    byte [] tmp;
    
    if(last > 0)
    {
     tmp = new byte[blocks*eng.getOutputBlockSize ()+eng.getOutputBlockSize ()];
    }
    else
    {
     tmp = new byte[blocks*eng.getOutputBlockSize ()];
    }
    
    for(int i=0; i<blocks; i++)
    {
      byte [] tmp1 = eng.processBlock(toEncrypt, i*blocksize, blocksize);
      System.arraycopy (tmp1, 0, tmp, i*eng.getOutputBlockSize (), tmp1.length);
    }
    
    if(last > 0)
    {
      byte [] tmp1 = eng.processBlock(toEncrypt, blocks*blocksize, last);
      System.out.println (tmp.length);
      System.out.println (blocks*eng.getOutputBlockSize ()+tmp1.length);
      System.arraycopy (tmp1, 0, tmp, blocks*eng.getOutputBlockSize (), tmp1.length);
    }
    
    return tmp;
  }


Добавлено через 5 минут и 47 секунд
А вот декрипт смог осилить для длины до 128 байт и до 256 бай. Выше - в расшифрованном тексте появляется мусор!
Помогите, коллеги - уже замучался...
Код

public byte [] RSADecrypt (byte [] toDecrypt) throws Exception {
    if (RSAprivKey == null)
      throw new Exception("Generate RSA keys first!");
    

    AsymmetricBlockCipher eng = new RSAEngine();

    if(toDecrypt.length <= 128) //  До 128 байт включительно
    {
      eng = new PKCS1Encoding(eng); 
      eng.init(false, RSAprivKey);
      return eng.processBlock(toDecrypt, 0, toDecrypt.length);
    }
    else
    {
      eng.init(false, RSAprivKey);
    }
    
    int blocksize = eng.getInputBlockSize ();
    int blocks = 0;
    if(toDecrypt.length >= blocksize)
    {
      blocks = (int)toDecrypt.length / blocksize;
    }
    int last = toDecrypt.length - blocks*blocksize;
    
    byte [] tmp;
    
    if(last > 0)
    {
     tmp = new byte[blocks*eng.getOutputBlockSize ()+eng.getOutputBlockSize ()];
    }
    else
    {
     tmp = new byte[blocks*eng.getOutputBlockSize ()];
    }
    
    int LastSize = 0;
    int offsetD = 0;
    int offset = 0;
    
    for(int i=0; i<blocks; i++)
    {
      if(i == blocks-1)  
      {
        eng = new PKCS1Encoding(eng); 
        eng.init(false, RSAprivKey);          
        byte [] tmp1 = eng.processBlock(toDecrypt, offsetD, eng.getInputBlockSize ());
        offsetD = offsetD + eng.getInputBlockSize ();
        System.out.println(i + "-1: " + new String(tmp1));
        LastSize = tmp1.length;
        System.arraycopy (tmp1, 0, tmp, offset, LastSize);
        offset = offset + LastSize;
      }
      else
      {
        eng.init(false, RSAprivKey);          
        byte [] tmp1 = eng.processBlock(toDecrypt, offsetD, eng.getInputBlockSize ());
        offsetD = offsetD + eng.getInputBlockSize ();
        System.out.println(i + "+1: " + new String(tmp1));
        System.arraycopy (tmp1, 0, tmp, offset, tmp1.length);
        offset = offset + tmp1.length;
      }
    }
    
    System.out.println("D: " + new String(tmp));
    
    if(last == 0)
    {
        int S = offset;
        byte [] tmpR = new byte [ S ];
        System.arraycopy(tmp, 0, tmpR, 0, S);
        return tmpR;
    }
    
    if(last > 0)
    {
      eng = new PKCS1Encoding(eng); //
      eng.init(false, RSAprivKey);          
      byte [] tmp1 = null;  
      System.out.println("L0: ");
      tmp1 = eng.processBlock(toDecrypt, blocks*blocksize, last);
      System.out.println("L1: " + new String(tmp1));
      System.out.println (tmp.length);
      System.out.println (blocks*eng.getOutputBlockSize ()+tmp1.length);
      System.arraycopy (tmp1, 0, tmp, blocks*eng.getOutputBlockSize (), eng.getOutputBlockSize ());
    }

    return tmp;
  }


С
eng = new PKCS1Encoding(eng); 
отлично расшифровывает без мусора блоки до 128 байт или последний блок, но на первые дает ексепшин:
Код

cp: unknown block type
        at ci.a(+233)
        at MB.HelloMidlet.RSADecrypt(+322)
        at MB.HelloMidlet.a(+72)


PM MAIL   Вверх
JackSoft
Дата 29.2.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



По декрипту пока выкрутился так:

Код

  public byte [] RSADecrypt (byte [] toDecrypt) throws Exception {
    if (RSAprivKey == null)
      throw new Exception("Generate RSA keys first!");
    
    AsymmetricBlockCipher eng = new RSAEngine();

    if(toDecrypt.length <= 128)
    {
      eng = new PKCS1Encoding(eng); //
      eng.init(false, RSAprivKey);
      return eng.processBlock(toDecrypt, 0, toDecrypt.length);
    }
    else
    {
      eng.init(false, RSAprivKey);
    }
    
    int blocksize = eng.getInputBlockSize ();
    System.out.println("BlockSize: " + blocksize);
    int blocks = (int)toDecrypt.length / blocksize;
    int last = toDecrypt.length - blocks*blocksize;
    
    byte [] tmp;
    
    if(last > 0)
    {
     tmp = new byte[blocks*eng.getOutputBlockSize ()+eng.getOutputBlockSize ()];
    }
    else
    {
     tmp = new byte[blocks*eng.getOutputBlockSize ()];
    }
    
    int LastSize = 0;
    int offsetD = 0;
    int offset = 0;
    
    for(int i=0; i<blocks; i++)
    {
      if(i == blocks-1)  
      {
        eng = new RSAEngine();
        eng = new PKCS1Encoding(eng); //
        eng.init(false, RSAprivKey);          
        byte [] tmp1 = eng.processBlock(toDecrypt, offsetD, blocksize);
        offsetD = offsetD + blocksize;
        System.out.println(i + "-1: " + new String(tmp1));
        LastSize = tmp1.length;
        System.arraycopy (tmp1, 0, tmp, offset, LastSize);
        offset = offset + LastSize;
      }
      else
      {
       try
       {
        eng = new RSAEngine();
        eng.init(false, RSAprivKey);          
        byte [] tmp1 = eng.processBlock(toDecrypt, offsetD, blocksize);
        offsetD = offsetD + blocksize;
        System.out.println(i + "+1: " + new String(tmp1));
        System.arraycopy (tmp1, 0, tmp, offset, tmp1.length);
        offset = offset + tmp1.length;
       }
       catch(Exception e)
       {
//           e.printStackTrace();
           eng = new RSABlindedEngine();
           eng = new PKCS1Encoding(eng); //
//        eng = new PKCS1Encoding(eng); //
           eng.init(false, RSAprivKey);          
           byte [] tmp1 = eng.processBlock(toDecrypt, offsetD, blocksize);
           offsetD = offsetD + blocksize;
           System.out.println(i + "+1: " + new String(tmp1));
           System.arraycopy (tmp1, 0, tmp, offset, tmp1.length);
           offset = offset + tmp1.length;           
       }
      }
    }
    
    System.out.println("D: " + new String(tmp));
    
    if(last == 0)
    {
        int S = offset;
        byte [] tmpR = new byte [ S ];
        System.arraycopy(tmp, 0, tmpR, 0, S);
        return tmpR;
    }
    
    if(last > 0)
    {
      eng = new PKCS1Encoding(eng); 
      eng.init(false, RSAprivKey);          
      byte [] tmp1 = null;  
      System.out.println("L0: ");
      tmp1 = eng.processBlock(toDecrypt, blocks*blocksize, last);
      System.out.println("L1: " + new String(tmp1));
      System.out.println (tmp.length);
      System.out.println (blocks*eng.getOutputBlockSize ()+tmp1.length);
      System.arraycopy (tmp1, 0, tmp, blocks*eng.getOutputBlockSize (), eng.getOutputBlockSize ());
    }

    return tmp;
  }


Может не красиво, но работает smile
Теперь давайте оптимизироваться... ;)
PM MAIL   Вверх
JackSoft
Дата 7.3.2008, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Все вопросы сняты. Спасибо.
PM MAIL   Вверх
JackSoft
Дата 15.4.2008, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А кто поделится опытом работы с эллиптическими кривыми? Есть знатоки?
icq: 44436588
PM MAIL   Вверх
vzf
Дата 19.6.2008, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Alexandr87 @  17.8.2007,  13:13 Найти цитируемый пост)
Цитата(VOS @  17.8.2007,  13:49 Найти цитируемый пост)
Исключения составляют случаи, когда Вы пользуетесь встроенными в ОС, терминалы и т.д. криптосредствами. Или Ваша криптография использует ключи менее 40 бит.

можно сцылку на документ?


Цитата(VOS @  17.8.2007,  13:49 Найти цитируемый пост)
Т.к. они сертифицируют приложения, которые используют лишь СКЗИ, основанные на алгоритмах ГОСТ (28147-89, 3411, 3410-2001 и т.д.)

Тоже бы хотелось увидеть нормативные документы. И, интересует вопрос, что они предлагают для ключевого обмена.


Я думаю стоит поверить тому, что говорит VOS smile Нам в универе говорили ровно тоже. Про ограничение 40 бит на ключи для симметрических криптоалгоритмов и то, что в РФ в ПО для гос. структур для постановки и проверки ЭЦП должен использоваться алгоритм, описанный в ГОСТ 34.10.
--------------------
Java - Write Once, Test EveryWhere!
PM MAIL   Вверх
onwave
Дата 12.8.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Народ, кто-нибудь знает как сохранить/загрузить сгенерированные при помощи bouncycastle RSA ключи на телефоне? Нужно делать/верифицировать подписи для отправляемых через http сообщений. 
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса

  • Прежде чем задать вопрос прочтите это!
  • Литература по Java находится здесь.
  • Литературу по Java обсуждаем здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда

  • FAQ раздела лежит здесь!
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java ME (J2ME) | Следующая тема »


 




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


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

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