前言:
对于DES加密,在博文 DES 加密 已经有了详细说明,这边博文将其用Android 实现。
更多的加密可以看:
实例:
实现的详细代码同 AES 加密的实例,这里将抽象的几个接口实现类DESEncryption 贴出来:
public class DESEncryption extends BlockEncryption {
// length of key must be 8.
private static final String DEFAULT_KEY = "shift926";
public static final String ALGORITHM = "DES";
private static final int DES_BLOCK_SIZE = 8;
public DESEncryption() {
}
public DESEncryption(Context context, boolean deleteSrcFile, EncryptionCallback callback) {
super(context, deleteSrcFile, callback);
}
@Override
public Cipher getCipher(int mode) {
return BlockEncryptionHelper.getCipher(mode, ALGORITHM, DEFAULT_KEY);
}
@Override
public String getAlgorithm() {
return ALGORITHM;
}
@Override
protected int getBlockSize() {
return DES_BLOCK_SIZE;
}
}
注意,key 位8个字节,也就是64位。如果不对,会报错:
12-06 07:54:56.340 3515 3551 W System.err: java.security.InvalidAlgorithmParameterException: IV must be 8 bytes long.
12-06 07:54:56.341 3515 3551 W System.err: at com.android.org.bouncycastle.jcajce.provider.symmetric.util.BaseBlockCipher.engineInit(BaseBlockCipher.java:730)
12-06 07:54:56.341 3515 3551 W System.err: at javax.crypto.Cipher.tryTransformWithProvider(Cipher.java:2664)
12-06 07:54:56.341 3515 3551 W System.err: at javax.crypto.Cipher.tryCombinations(Cipher.java:2575)
12-06 07:54:56.341 3515 3551 W System.err: at javax.crypto.Cipher$SpiAndProviderUpdater.updateAndGetSpiAndProvider(Cipher.java:2480)
12-06 07:54:56.341 3515 3551 W System.err: at javax.crypto.Cipher.chooseProvider(Cipher.java:567)
12-06 07:54:56.341 3515 3551 W System.err: at javax.crypto.Cipher.init(Cipher.java:975)
12-06 07:54:56.341 3515 3551 W System.err: at javax.crypto.Cipher.init(Cipher.java:910)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.core.BlockEncryptionHelper.getCipher(BlockEncryptionHelper.java:91)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.des.DESHelper.getCipher(DESHelper.java:13)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.des.DESEncryption.getCipher(DESEncryption.java:18)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.core.BlockEncryption.encryptFile(BlockEncryption.java:153)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.FileEncryption.encryptFiles(FileEncryption.java:145)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.FileEncryption.operation(FileEncryption.java:200)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.FileEncryption.-wrap0(Unknown Source:0)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.FileEncryption$EncryptionTask.doInBackground(FileEncryption.java:215)
12-06 07:54:56.342 3515 3551 W System.err: at com.shift.encrytion.FileEncryption$EncryptionTask.doInBackground(FileEncryption.java:213)
12-06 07:54:56.342 3515 3551 W System.err: at android.os.AsyncTask$2.call(AsyncTask.java:333)
12-06 07:54:56.342 3515 3551 W System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
12-06 07:54:56.342 3515 3551 W System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
12-06 07:54:56.342 3515 3551 W System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
12-06 07:54:56.342 3515 3551 W System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
12-06 07:54:56.342 3515 3551 W System.err: at java.lang.Thread.run(Thread.java:764)
Activity 中设置button 进行点击:
private void testEncryptionDES() {
Button edes = (Button) findViewById(R.id.encrypt_des);
edes.setOnClickListener(this);
Button ddes = (Button) findViewById(R.id.decrypt_des);
ddes.setOnClickListener(this);
}
private void desEncryption() {
{
mOperationTitle.setText(getString(R.string.encrypt_des));
String strSource = "hliuhiufhliuhsd;jfijso;goshgosjogijsgo;j";
mBeforeOperation.setText(getString(R.string.before_operation, strSource));
DESEncryption encryption = new DESEncryption();
mStrEncrypted = encryption.strEncryption(strSource);
mAfterOperation.setText(getString(R.string.after_operation, mStrEncrypted));
}
// if (mFileEncryption != null) {
// Log.d(TAG, "==== test file, encryption with des ...");
// String filePath = "/storage/emulated/0/hehe.png";
// String destPath = "/storage/emulated/0/2.png";
// mFileEncryption.setAlgorithm(FileEncryption.ALG_MODE_DES);
// mFileEncryption.start(FileEncryption.MODE_ENCRYPT, filePath, destPath);
// Log.d(TAG, "==== test file, encryption end");
// }
}
private void desDecryption() {
{
mOperationTitle.setText(getString(R.string.decrypt_des));
mBeforeOperation.setText(getString(R.string.before_operation, mStrEncrypted));
DESEncryption encryption = new DESEncryption();
String strDecrypted = encryption.strDecryption(mStrEncrypted);
mAfterOperation.setText(getString(R.string.after_operation, strDecrypted));
}
// if (mFileEncryption != null) {
// Log.d(TAG, "==== test file, decryption with des ...");
// String filePath = "/storage/emulated/0/hehe.png";
// String destPath = "/storage/emulated/0/2.png";
// mFileEncryption.setAlgorithm(FileEncryption.ALG_MODE_DES);
// mFileEncryption.start(FileEncryption.MODE_DECRYPT, destPath, filePath);
// Log.d(TAG, "==== test file, decryption end");
// }
}
注释掉的是对于文件的加密、解密,同样是实用的。
结果: