Android - Crittografy Cipher 解密不起作用

标签 android encryption

我需要加密一个字符串然后解密。加密函数运行良好,但是当我将加密值传递给解密函数时,我收到空指针异常。如果我在 Java 应用程序中使用相同的代码,一切都运行良好。

public class Cripthografy {
private static String TAG="freeliberomail";

 public static String encrypt(String seed, String cleartext){
   byte[] rawKey;
   byte[] result=null;
 try {
rawKey = getRawKey(seed.getBytes());

     result = encrypt(rawKey, cleartext.getBytes());
  } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
  }
   return toHex(result);
  }

  public static String decrypt(String seed, String encrypted) {
    byte[] rawKey;
    byte[] result=null;
   try {
rawKey = getRawKey(seed.getBytes());

    byte[] enc = toByte(encrypted);
    result = decrypt(rawKey, enc);
    } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
   }
    return new String(result);
   }


   private static byte[] getRawKey(byte[] seed) throws Exception {
      KeyGenerator kgen = KeyGenerator.getInstance("AES");
      SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
      sr.setSeed(seed);
      kgen.init(128, sr); // 192 and 256 bits may not be available
      SecretKey skey = kgen.generateKey();
      byte[] raw = skey.getEncoded();
      return raw;
    }
    private static byte[] encrypt(byte[] raw, byte[] clear){
 byte[] encrypted=null;
      SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
      Cipher cipher;
     try {
 cipher = Cipher.getInstance("AES");
     cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
     encrypted = cipher.doFinal(clear);
     } catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    } catch (NoSuchPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    } catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    } catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    } catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
    }
     return encrypted;
    }


     private static byte[] decrypt(byte[] raw, byte[] encrypted) {
 byte[] decrypted = null;
     SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
     Cipher cipher;
     try {
 cipher = Cipher.getInstance("AES");
     cipher.init(Cipher.DECRYPT_MODE, skeySpec);
     decrypted = cipher.doFinal(encrypted);
     }catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      } catch (InvalidKeyException e) {
// TODO Auto-generated catch block
e.printStackTrace(); 
     } catch (IllegalBlockSizeException e) {
// TODO Auto-generated catch block
e.printStackTrace();
   } catch (BadPaddingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
   }

    return decrypted;
   }


  public static String toHex(String txt) {
  return toHex(txt.getBytes());
  }

 public static String fromHex(String hex) {
 return new String(toByte(hex));
 }

 public static byte[] toByte(String hexString) {
  int len = hexString.length()/2;
  byte[] result = new byte[len];
  for (int i = 0; i < len; i++)
  result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
  return result;
 }


  public static String toHex(byte[] buf) {
    if (buf == null)
    return "";
    StringBuffer result = new StringBuffer(2*buf.length);
      for (int i = 0; i < buf.length; i++) {
        appendHex(result, buf[i]);
    }
     return result.toString();
   }
  private final static String HEX = "0123456789ABCDEF";
  private static void appendHex(StringBuffer sb, byte b) {
  sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
  }

}

然后我打电话:

          String encValue=Cripthografy.encrypt("MY_KEY", "helloworld");
      String decValue=Cripthografy.decrypt("MY_KEY",  encValue);
      Log.d(TAG,"encript:"+encValue+" "+"decript:"+decValue);

异常(exception)是:

      01-17 03:57:23.986: W/System.err(29846): javax.crypto.BadPaddingException: pad      block corrupted
       01-17 03:57:23.991: W/System.err(29846):     at      com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineDoFinal(B           aseBlockCipher.java:709)
       01-17 03:57:23.991: W/System.err(29846):     at       javax.crypto.Cipher.doFinal(Cipher.java:1111)
        01-17 03:57:23.991: W/System.err(29846):    at    marvellous.freeliberomail.Cripthografy.decrypt(Cripthografy.java:111)
        01-17 03:57:23.991: W/System.err(29846):    at   marvellous.freeliberomail.Cripthografy.decrypt(Cripthografy.java:55)
         01-17 03:57:23.991: W/System.err(29846):   at   marvellous.freeliberomail.Auth.writeCookieTofile(Auth.java:307)
        01-17 03:57:23.991: W/System.err(29846):    at marvellous.freeliberomail.Auth.createSessionCookie(Auth.java:287)
        01-17 03:57:23.991: W/System.err(29846):    at marvellous.freeliberomail.Auth.scenario(Auth.java:196)
        01-17 03:57:23.991: W/System.err(29846):    at marvellous.freeliberomail.Auth.accessMail(Auth.java:117)
        01-17 03:57:23.991: W/System.err(29846):    at marvellous.freeliberomail.Auth.run(Auth.java:96)
       01-17 03:57:23.991: W/System.err(29846):     at java.lang.Thread.run(Thread.java:856)
        01-17 03:57:23.996: W/dalvikvm(29846): threadid=11: thread exiting with uncaught exception (group=0x41584930)
            01-17 03:57:23.996: E/AndroidRuntime(29846): FATAL EXCEPTION: Thread-32785
            01-17 03:57:23.996: E/AndroidRuntime(29846): java.lang.NullPointerException
            01-17 03:57:23.996: E/AndroidRuntime(29846):    at java.lang.String.<init>(String.java:141)
            01-17 03:57:23.996: E/AndroidRuntime(29846):    at marvellous.freeliberomail.Cripthografy.decrypt(Cripthografy.java:60)
            01-17 03:57:23.996: E/AndroidRuntime(29846):    at marvellous.freeliberomail.Auth.writeCookieTofile(Auth.java:307)
             01-17 03:57:23.996: E/AndroidRuntime(29846):   at marvellous.freeliberomail.Auth.createSessionCookie(Auth.java:287)
            01-17 03:57:23.996: E/AndroidRuntime(29846):    at marvellous.freeliberomail.Auth.scenario(Auth.java:196)
            01-17 03:57:23.996: E/AndroidRuntime(29846):    at marvellous.freeliberomail.Auth.accessMail(Auth.java:117)
             01-17 03:57:23.996: E/AndroidRuntime(29846):   at marvellous.freeliberomail.Auth.run(Auth.java:96)
            01-17 03:57:23.996: E/AndroidRuntime(29846):    at java.lang.Thread.run(Thread.java:856)

最佳答案

是的,android Cipher 确实有一些问题。 一是 cipher.doFinal(encrypted) 中的 byte[] 有时必须具有正确的长度。尝试用 128 位的加密数组输入它(用 0 填充?)

经过许多痛苦的时间,这个例子终于起作用了:

private static byte[] key = "12345678".getBytes();// 64 bit 
private static byte[] iv = "12345678".getBytes();

public static String encrypt(String in) {
    String cypert = in;
    try {
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        SecretKeySpec k = new SecretKeySpec(key, "DES");
        Cipher c = Cipher.getInstance("DES/CBC/PKCS7Padding");
        c.init(Cipher.ENCRYPT_MODE, k, ivSpec);
        byte[] encryptedData = c.doFinal(in.getBytes());
        cypert = Base64.encodeLines(encryptedData);
    } catch (Exception e) {
        Debugger.error(e);
    }
    return cypert;
}


public static String decrypt(String in) throws Exception {
    String plain=in;
    try {
        IvParameterSpec ivSpec = new IvParameterSpec(iv);
        SecretKeySpec keys = new SecretKeySpec(key, "DES");
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS7Padding");
        cipher.init(Cipher.DECRYPT_MODE, keys, ivSpec);
        // decryption pass
        byte[] cipherText = Base64.decodeLines(in);
        int ctLength = cipherText.length;
        byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        bos.write(cipher.doFinal(cipherText));
        plainText = bos.toByteArray();
        bos.close();
        plain = new String(plainText, "UTF8");
    } catch (Exception e) {
        Debugger.error(e);
    }
    return plain;
}

关于Android - Crittografy Cipher 解密不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14371709/

相关文章:

Java 7 和 TLSv1.2 套接字

encryption - 使用 helm 和 gcp_kms 加密 Secrets.yml 文件时 key 权限被拒绝

android - 图像未加载到 ImageView 中

android - 使用 Android 应用程序进行应用内购买

当显示虚拟键盘并涉及 SurfaceView 时,Android EditText 被隐藏

java - 在 Java Android App 中将输入流转换为字符串值

java - Java 中的 ROT-N(或 ROT-X)函数

java - 从光盘加载时无法解密 XML 文件

C#加密,C++解密。最后几个字节解密失败

android - 错误 : android. content.res.Resources$NotFoundException