2

AndroidにAES 128ビット暗号化を実装しようとしています。cipher.doFinal でプロセスが停止します。キャッチブロックにも入りません。コードを添付しました。

public class MainActivity extends Activity {

  EditText encryptText;
  Button encryptButton;
  String key = "16bitkey";
  String requestData;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initViews();
  }

  public void initViews(){

    encryptText = (EditText) findViewById(R.id.encryptText);
    encryptButton = (Button) findViewById(R.id.encryptButton);
    encryptButton.setOnClickListener(new OnClickListener() {

      @Override
      public void onClick(View arg0) {
        // TODO Auto-generated method stub
        new event_background().execute();
      }
    });
  }


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  }

  public void performSocketRequest(){
    try{
      requestData = encryptText.getText().toString();
      byte[] keyInBytes = convertToByteArray(key);
      byte[] requestInBytes = convertToByteArray(requestData);
      byte[] aesEncryptedData = aesEncryption(keyInBytes, requestInBytes);
    }
    catch(Exception e){
    }
  }

  public byte[] convertToByteArray(String data){

    byte[] bytes = null;
    try{
      bytes = data.getBytes("UTF8");
    }catch(Exception e){

    }
    return bytes;
  }

  public byte[] aesEncryption(byte[] raw, byte[] clear) throws Exception{

    try{

      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
      sr.setSeed(raw);
      kgen.init(128, sr);
      SecretKey skey = kgen.generateKey();
      byte[] keyTemp = skey.getEncoded(); 
      byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
      IvParameterSpec ivspec = new IvParameterSpec(iv);

      SecretKeySpec skeySpec = new SecretKeySpec(keyTemp, "AES");
      Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
      cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
      return cipher.doFinal(clear);

    }catch(IllegalBlockSizeException e){
      Log.e("*********** IllegalBlockSizeException error **************", e.getMessage());
    }catch(BadPaddingException e){          
      Log.e("*********** BadPaddingException error **************", e.getMessage());          
    }catch(Exception e){          
      Log.e("*********** error **************", e.getMessage());
    }

    return null;
  }

  class event_background extends AsyncTask<Void, String, Void> {

    @Override
    protected void onPreExecute() {
      super.onPreExecute();
    }

    @Override
    protected void onPostExecute(Void unused) {
    }

    @Override
    protected Void doInBackground(Void... params) {
      // TODO Auto-generated method stub
      performSocketRequest();
      return null;
    }
  }
}
4

1 に答える 1

0

暗号化/復号化をアーカイブする別の方法:

使用法

暗号化:

 MCrypt mcrypt = new MCrypt();
 String encrypted = MCrypt.bytesToHex(mcrypt.encrypt("Text to Encrypt"));

復号化:

MCrypt mcrypt = new MCrypt();
String decrypted = new String(mcrypt.decrypt(encrypted));

クラス コード: (2.1 以降のデバイスでテスト済みで動作します。4 以降ではテストされていませんが、動作するはずです)

import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class MCrypt {

    private String iv = "fedcba9876543210";//Dummy iv (CHANGE IT!)
    private IvParameterSpec ivspec;
    private SecretKeySpec keyspec;
    private Cipher cipher;
    private String SecretKey = "0123456789abcdef";//Dummy secretKey (CHANGE IT!)

    public MCrypt() {
        ivspec = new IvParameterSpec(iv.getBytes());

        keyspec = new SecretKeySpec(SecretKey.getBytes(), "AES");

        try {
            cipher = Cipher.getInstance("AES/CBC/NoPadding");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        }
    }

    public byte[] encrypt(String text) throws Exception {
        if (text == null || text.length() == 0) throw new Exception("Empty string");

        byte[] encrypted = null;

        cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

        encrypted = cipher.doFinal(padString(text).getBytes());
        try { //  for OS version 2.2+
            encrypted = android.util.Base64.encode(encrypted, android.util.Base64.NO_PADDING);
        } catch (NoClassDefFoundError e) {
            encrypted = org.apache.commons.codec.binary.Base64.encodeBase64(encrypted);
        }

        return encrypted;
    }

    public byte[] decrypt(String code) throws Exception {
        if (code == null || code.length() == 0) throw new Exception("Empty string");

        byte[] decrypted = null;

        cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

        try { // for OS version 2.2+
            decrypted = cipher.doFinal(android.util.Base64.decode(code, android.util.Base64.NO_PADDING));
        } catch (NoClassDefFoundError e) {
            decrypted = cipher.doFinal(org.apache.commons.codec.binary.Base64.decodeBase64(code.getBytes("UTF-8")));
        }
        return decrypted;
    }



    private static String padString(String source) {
        char paddingChar = ' ';
        int size = 16;
        int x = source.length() % size;
        int padLength = size - x;

        for (int i = 0; i < padLength; i++) {
            source += paddingChar;
        }

        return source;
    }
}

関連リンク: http://www.androidsnippets.com/encrypt-decrypt-between-android-and-php

于 2013-03-12T09:22:56.253 に答える