AESДекрипция в Blackberry - PullRequest
       1

AESДекрипция в Blackberry

1 голос
/ 04 января 2012

У меня есть приложение, которое отображает изображение, загруженное с сервера.изображение зашифровано и хранится на сервере с использованием AES.Мне нужно расшифровать изображение на стороне клиента.Код, используемый для шифрования, выглядит следующим образом

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.MessageDigest;
import java.security.Security;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.imageio.ImageIO;

public class Crypto {
    Cipher ecipher;
    Cipher dcipher;

    /**
    * Input a string that will be md5 hashed to create the key.
    * @return void, cipher initialized
    */

    public Crypto(){
        try{
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128);
            this.setupCrypto(kgen.generateKey());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public Crypto(String key){
        SecretKeySpec skey = new SecretKeySpec(getMD5(key), "AES");
        this.setupCrypto(skey);
    }

    private void setupCrypto(SecretKey key){
        try
        {    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            ecipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
            dcipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

            ecipher.init(Cipher.ENCRYPT_MODE, key);
            dcipher.init(Cipher.DECRYPT_MODE, key);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }

    // Buffer used to transport the bytes from one stream to another
    byte[] buf = new byte[1024];

    public void encrypt(InputStream in, OutputStream out){
        try {
            // Bytes written to out will be encrypted
            out = new CipherOutputStream(out, ecipher);

            // Read in the cleartext bytes and write to out to encrypt
            int numRead = 0;
            while ((numRead = in.read(buf)) >= 0){
                out.write(buf, 0, numRead);
            }
            out.close();
        }
        catch (java.io.IOException e){
            e.printStackTrace();
        }
    }


    public void decrypt(InputStream in, OutputStream out){

        try {
            // Bytes read from in will be decrypted
            in = new CipherInputStream(in, dcipher);

            // Read in the decrypted bytes and write the cleartext to out
            int numRead = 0;
            while ((numRead = in.read(buf)) >= 0) {
                out.write(buf, 0, numRead);
            }
            out.close();
        } catch (java.io.IOException e) {
             e.printStackTrace();
        }
    }

    private static byte[] getMD5(String input){
        try{
            byte[] bytesOfMessage = input.getBytes("UTF-8");
            MessageDigest md = MessageDigest.getInstance("MD5");
            return md.digest(bytesOfMessage);
        }  catch (Exception e){
             return null;
        }
    }


    public static void main(String args[]){
        try {


            Crypto encrypter = new Crypto("yursxjdlbkuikeqe");  ///key for decryption logic
             encrypter.encrypt(new FileInputStream("D:\\Path\\Lighthouse.jpg"),new FileOutputStream("D:\\Encryption\\iOS code base\\Lighthouse.jpg.pkcs5"));
               encrypter.decrypt(new FileInputStream("D:\\Path\\Lighthouse.jpg.pkcs5"),new FileOutputStream("D:\\Encryption\\iOS code base\\Lighthouse.jpg"));
             System.out.println("DONE");
       }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Я не могу расшифровать это с помощью Blackberry AESDecryptor Engine.Я новичок в этой криптографии.Можно ли расшифровать с помощью движка AESDecryptor.Я прилагаю код, который я использую.Пожалуйста, помогите мне в решении этого

public MyScreen(){       
        // Set the displayed title of the screen       
        setTitle("MyTitle");

        byte[] keyData = new String("yursxjdlbkuikeqe").getBytes();
        byte[] cipherText = openFile("file:///SDCard/Lighthouse.jpg.pkcs5");
        try {
            imageData = decrypt(keyData, cipherText);
        } catch (CryptoException e) {
            System.out.println("::::::::::::::::::::::::::::::::::Crypto Exception:::::::"+e.getMessage());
        } catch (IOException e) {
            System.out.println("::::::::::::::::::::::::::::::::::IO Exception:::::::"+e.getMessage());
        }
        if(imageData!=null){
            writeByteData(imageData);
//          EncodedImage image = EncodedImage.createEncodedImage(imageData, 0, imageData.length);
//          add(new BitmapField(image.getBitmap()));
            System.out.println("------------------Image saved successfully-----------");
        }else{
            System.out.println("-------------------Image Data is null");
        }
    }

public static byte[] decrypt(byte[] keyData, byte[] ciphertext) throws CryptoException, IOException {
        // First, create the AESKey again.
        /*String str=new String(keyData);
        System.out.println(str);*/

        AESKey key = new AESKey(keyData,0,128);
        System.out.println("Key is ::"+key.getAlgorithm()+"Length:"+key.getBitLength());
//
//      // Now, create the decryptor engine.
        AESDecryptorEngine engine = new AESDecryptorEngine(key);
        PKCS5UnformatterEngine uengine = new PKCS5UnformatterEngine(engine);
/
//      // Create the BlockDecryptor to hide the decryption details away.
        ByteArrayInputStream input = new ByteArrayInputStream(ciphertext);
        BlockDecryptor decryptor = new BlockDecryptor(engine, input);
        byte[] plaintextAndHash = new byte[1024];
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        int bytesRead=0;
        do{
            bytesRead =decryptor.read(plaintextAndHash);
            if(bytesRead!=-1){
                output.write(plaintextAndHash,0,bytesRead);
            }

        }
        while(bytesRead!=-1);


        return output.toByteArray();
    }

Ответы [ 2 ]

1 голос
/ 05 января 2012

Вы на самом деле не говорите, в чем ваша проблема, но по крайней мере следующая строка выглядит неправильно:

BlockDecryptor decryptor = new BlockDecryptor(engine, input);

Это должно быть

BlockDecryptor decryptor = new BlockDecryptor(uengine, input);

Я только что изменил engineдо uengine

0 голосов
/ 05 января 2012

API RIM делают это довольно легко, но найти документацию немного сложно.Проверьте Javadocs для пакета net.rim.device.api.crypto на:

http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/crypto/package-summary.html

Вы должны просмотреть все это, но ответ находится в номере 7:декрипторные заводы.

http://www.blackberry.com/developers/docs/7.0.0api/net/rim/device/api/crypto/doc-files/factories.html

DecryptorFactory может создать поток ввода, который вы можете просто прочитать как любой InputStream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...