2012-01-04 24 views
1

私は、サーバーからダウンロードしたイメージを表示するアプリケーションを持っています。イメージは暗号化され、AESを使用してサーバーに保存されます。私はクライアント側でイメージを解読する必要があります。暗号化に使用されるコードは次のとおりです。ブラックベリーでの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エンジンを使用して解読することは可能ですか?私は使用しているコードを添付しています。

BlockDecryptor decryptor = new BlockDecryptor(engine, input); 

それは

BlockDecryptor decryptor = new BlockDecryptor(uengine, input); 

する必要があります:あなたは本当にあなたの問題が何であるかを言うことはありませんが、少なくとも、次の行が正しくないに見えるこの

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(); 
    } 
+1

「ブラックベリーAESDecryptorエンジンを使用してこれを復号化できません」は有益ではありません。問題の内容を正確に示すエラーメッセージやその他の証拠を明記してください。 –

答えて

1

を解決するために私を助けてください。私はちょうど変わったengineuengine

+0

こんにちは、私はこの暗号化されたイメージを解読することができますBlockDecryptorを使用してwhetehrを知りたいですか?私はこれのためにいくつかの他のAPIを使用すべきですか? – user1111471

0

RIMのAPIsはこのプレットを作る簡単ですが、ドキュメントを見つけるのは少し難しいです。で、パッケージnet.rim.device.api.cryptoのJavadocをチェックアウト:

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

あなたはそれのすべてに目を通す必要がありますが、答えは数7である:Encryptorはと復号化工場。

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

DecryptorFactoryはあなただけで任意のInputStreamとして読み取ることができる入力ストリームを作成することができます。