在JavaSE和Android类库下运行的Java加密例程

在JavaSE和Android类库下运行的Java加密例程,java,android,algorithm,encryption,Java,Android,Algorithm,Encryption,我想用Java编写一个加密例程,可以在标准Java类库和Android类库下运行。该例程用于使用基于密码的密钥和标准对称密码(如AES)对字节数组进行加密/解密。 以下是我的想法要点: static final int ITERATION_COUNT = 10_000; static final byte[] SALT = {37, -19, . . . 88, 0, 127, 3, 82}; static final PBEParameterSpec PBE_PARAM_SPEC =

我想用Java编写一个加密例程,可以在标准Java类库和Android类库下运行。该例程用于使用基于密码的密钥和标准对称密码(如AES)对字节数组进行加密/解密。 以下是我的想法要点:

static final int ITERATION_COUNT = 10_000;
static final byte[] SALT = {37, -19, . . . 88, 0, 127, 3, 82};
static final PBEParameterSpec PBE_PARAM_SPEC = 
    new PBEParameterSpec(SALT, ITERATION_COUNT);
static final String ALGORITHM = "PBEwithSHAand128bitAES-CBC-BC";

char[] passwordChars = “SECRET!”.toCharArray();

PBEKeySpec pbeKeySpec = new PBEKeySpec(passwordChars);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
SecretKey pbeKey = keyFactory.generateSecret(pbeKeySpec);
Cipher encryptingCipher = Cipher.getInstance(ALGORITHM);
encryptingCipher.init(Cipher.ENCRYPT_MODE, pbeKey, PBE_PARAM_SPEC);
Cipher decryptingCipher = Cipher.getInstance(ALGORITHM);
decryptingCipher.init(Cipher.DECRYPT_MODE, pbeKey, PBE_PARAM_SPEC);

byte[] plainBytesIn = . . . the message to be encrypted . . .

byte[] cipherBytes = encryptingCipher.doFinal(plainBytesIn);

byte[] plainBytesOut = decryptingCipher.doFinal(cipherBytes);
我发现这个例程在Android下运行良好,但在JavaSE下失败

原因是我在Android下运行时,从以下例程生成的算法名称列表中选择了使用的特定算法(即,使用SHA和128位AES进行密码块链接的基于密码的加密):

void listProviders() {
    for (Provider provider : Security.getProviders()) {
        log(provider.getName());
        for (String key : provider.stringPropertyNames()) {
            log("\t" + key + "\t" + provider.getProperty(key));
        }
    }
}
然而,当在JavaSE下运行时,我发现它生成了一个算法名称列表,这些名称看起来非常不同。特别是,上述算法(“PBEwith…”)在JavaSE下似乎不可用,因此导致加密例程失败


两个库是否都有可用的算法(每个列表中可能有不同的名称)?(我不太在意算法的精确细节:它必须足够强大,以满足常规低价值商业用途。)如果不是,从javax.crypto库提供的基本组件中整合自己的整体加密算法是否困难?

您应该知道,即使不是所有Android设备都有相同的算法集。你应该知道,甚至不是所有的Android设备都有相同的算法集。