我如何使用 Bouncy CaSTLe 提供程序来实现 Serpent 和 Twofish 等算法,因为 Sun 的提供程序根本没有实现这些算法。我知道当多个提供者可以实现相同的算法时,您会从排名最高的提供者(将是 Sun 提供者)中获得实现。如果出于某种原因您想使用来自特定提供程序的实现(可能是因为您知道它更快),您可以在 getInstance() 的两个参数版本中指定提供程序。就我而言,Sun 提供商根本没有实现我感兴趣的算法。
我曾尝试实现 Serpent:
public static final String FILE_EXTENSION = ".serpent";
public static final String PROVIDER = "BC"; // Bouncy Castle
public static final String BLOCK_CIPHER = "Serpent";
public static final String TRANSFORMATION = "Serpent/CBC/PKCS7Padding";
public static final String KEY_ALGORITHM = "PBKDF2WithHmacSHA1";
public static final String PRNG_ALGORITHM = "SHA1PRNG";
public static final int BLOCK_SIZE = 128; // bits
public static final int KEY_SIZE = 256; // bits
public static final int ITERATION_COUNT = 1024; // for PBE
/** Performs the encryption of a file. */
public void encrypt(String pathname, char[] password, byte[] salt) {
// Use bouncy castle as our provider
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
// Convert the file into a byte array
byte[] plaintext = fileToBytes(new File(pathname));
// Generate a 256-bit key
SecretKey key = generateSecretKey(password,salt);
// Generate a 128-bit secure random IV
byte[] iv = generateIV();
// Setup the cipher and perform the encryption
Cipher cipher = null;
byte[] ciphertext = null;
try {
cipher = Cipher.getInstance(TRANSFORMATION, PROVIDER);
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
ciphertext = cipher.doFinal(plaintext);
} catch (Exception e) {
e.printStackTrace();
}
// Append the IV to the ciphertext
byte[] temp = new byte[iv.length+ciphertext.length];
System.arraycopy(iv, 0, temp, 0, iv.length);
System.arraycopy(ciphertext, 0, temp, iv.length, ciphertext.length);
ciphertext = temp;
// Store the encrypted file in the same directory we found it
if (Environment.getExternalStorageDirectory().canWrite()) {
bytesToFile(ciphertext, pathname+FILE_EXTENSION);
File file = new File(pathname);
file.delete();
}
}
然而,这会抛出一个
在我打电话的那条线上
运行
$ adb shell
# logcat
我得到了很多
not resolving ambiguous class
not verifying
multiple definitions
输出错误。知道什么可能导致这种情况发生以及我如何解决这个问题?
最佳答案
您可能想要 Spongy Castle - 我专门针对 Android 制作的 Bouncy CaSTLe 重新包装。
Spongy CaSTLe 完全替代了 Android 附带的 Bouncy CaSTLe 加密库的残缺版本。有几个小改动可以让它在 Android 上运行:
“海绵城堡救了我的屁股。” - 来自一位快乐用户的反馈:)
关于java - 使用 Android 实现 Bouncy CaSTLe 密码算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6037897/