tutorial org elliptic cert bouncy blackberry cryptography rsa bouncycastle public-key-encryption

blackberry - elliptic - org bouncycastle cert maven



BouncyCastle J2ME RSA utilizando claves personalizadas (2)

Lo hice usando bouncycastle, pero con RIM Crypto es similar. Sigue el ejemplo. Como puede ver, las teclas son cuerdas ...

public CypherDecypherExample() { String plain ="a plain string"; String cipher = null; String decipher = null; byte [] byte_cipher = null; byte [] byte_plain = null; // key |-- 128 bit -->|-- 256 bit --->| String key = "aaaaaaaaaaaaaaaacccccccccccccccc"; String iv = "bbbbbbbbbbbbbbbb"; System.out.println("bouncycastle.plain: " + plain); try { byte_cipher = encrypt(plain.getBytes(), key.getBytes(), iv.getBytes()); cipher = new String(byte_cipher); System.out.println("bouncycastle.cipher: " + cipher); } catch (Exception e) { e.printStackTrace(); } try { byte_plain = decrypt(byte_cipher, key.getBytes(), iv.getBytes()); decipher = new String(byte_plain); System.out.println("bouncycastle.decipher: " + decipher); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } private static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data) throws Exception { String plain = new String(data); System.out.println("bouncycastle.cipherData: " + plain); int minSize = cipher.getOutputSize(data.length); byte[] outBuf = new byte[minSize]; int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0); int length2 = cipher.doFinal(outBuf, length1); int actualLength = length1 + length2; byte[] result = new byte[actualLength]; System.arraycopy(outBuf, 0, result, 0, result.length); System.out.println("bouncycastle.cipherData returning"); return result; } private static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv) throws Exception { PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher((BlockCipher) new CBCBlockCipher( new AESEngine())); CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); aes.init(false, ivAndKey); return cipherData(aes, cipher); } private static byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception { PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(new CBCBlockCipher( new AESEngine())); CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv); aes.init(true, ivAndKey); return cipherData(aes, plain); }

Me gustaría utilizar BouncyCastle J2ME / RIM Crypto en mi aplicación Blackberry.

El problema que estoy teniendo es que me gustaría generar la clave pública para el cifrado de un programa C # .NET que envía la clave a BlackBerry.

¿Es posible encriptar un mensaje usando una cadena sin formato? Además, ¿necesito conocer otras variables comunes como modulo, etc.? Disculpas, pero soy completamente nuevo en algoritmos de criptografía.

¿Necesito BouncyCastle para esto o puedo hacer lo anterior con RIM Crypto?

Gracias, Conor


Una clave pública de RSA consta de dos componentes, no solo uno como yo pensaba.

Está el Exponent y el Modulus . Ambos son números, pero los paso al Blackberry del cliente .NET como cadenas Base64 y los decodifico en matrices de bytes cuando los utiliza la función RIM Crypto, ya que toman los arrays Byte como parámetros.

byte[] exponent = Base64InputStream.decode("exponent base64 string"); byte[] modulus = Base64InputStream.decode("modulus base64 string"); NoCopyByteArrayOutputStream cipherUserData = new NoCopyByteArrayOutputStream(); RSACryptoSystem cryptoSystem = new RSACryptoSystem(1024); // Create Public key using your variables from before RSAPublicKey publicKey = new RSAPublicKey( cryptoSystem, exponent, modulus); // Encryption engine objects RSAEncryptorEngine eEngine = new RSAEncryptorEngine(publicKey); PKCS1FormatterEngine fEngine = new PKCS1FormatterEngine(eEngine); BlockEncryptor cryptoStream = new BlockEncryptor(fEngine, cipherUserData); // Read the user data and encrypt while doing so. Remember, cryptoStream writes its data to // cipherUserData so this is where the encrypted version of userData will end up. cryptoStream.write( userData, 0, userData.length ); cryptoStream.close(); cipherUserData.close(); String encryptedUserData = new String(cipherUserData.toByteArray());

Eso es casi todo lo que hay, amigos, es sencillo, pero me tomó mucho tiempo obtener esto de los documentos de la API :)

Nota importante RSA está limitado para fines de cifrado, ya que solo puede encriptar un mensaje con un <= tamaño de clave. Eso es 117 bytes para 1024 Bit RSA y 245 bytes para 2048 RSA. Para encriptar mensajes más grandes, la forma aceptada es encriptar el mensaje usando AES o similar y luego encriptar la clave AES con la clave pública RSA. Enviarás el texto cifrado AES y también el texto cifrado RSA que contiene la clave para descifrar el texto cifrado AES.

Lo que he escrito arriba tomó días de retoques y lectura. Espero que ayude a alguien a lograr su objetivo más rápido que eso. :)