返回字节数组时出错
我使用以下代码
public byte[] encrypt(byte[] unencryptedString,String k)throws Exception { String encryptedString = null; String k1 = String.format("%024d", Integer.parseInt(k)); myEncryptionKey = k1; myEncryptionScheme = DESEDE_ENCRYPTION_SCHEME; arrayBytes = myEncryptionKey.getBytes(UNICODE_FORMAT); ks = new DESedeKeySpec(arrayBytes); skf = SecretKeyFactory.getInstance(myEncryptionScheme); cipher = Cipher.getInstance(myEncryptionScheme); key = skf.generateSecret(ks); try { cipher.init(Cipher.ENCRYPT_MODE, key); byte[] plainText = unencryptedString/*.getBytes(UNICODE_FORMAT)*/; byte[] encryptedText = cipher.doFinal(plainText); // encryptedString = new String(Base64.encodeBase64(encryptedText)); } catch (Exception e) { e.printStackTrace(); } return encryptedText; }
return语句给出以下错误:
encryptedText无法解析为变量
与其他答案相反,如果您无法加密文本,我不会将您的代码更改为返回null
– 我会让这个失败冒出来作为例外。 我不会声明你的方法也可以抛出Exception
– 我指定它可以抛出哪些exception。 您可以在非常细粒度的级别上执行此操作,或者在这种情况下使用GeneralSecurityException
,它涵盖您感兴趣的所有加密特定的exception。
我进一步停止不必要地使用字段 – 你不需要在这里改变任何状态。
完成所有这些重构后,您的方法将成为:
public static byte[] encrypt(String unencryptedString, String k) throws GeneralSecurityException { String keySpecText = String.format("%024d", Integer.parseInt(k)); byte[] keySpecBytes = keySpecText.getBytes(StandardCharsets.UTF_16); KeySpec ks = new DESedeKeySpec(keySpecBytes); SecretKeyFactory skf = SecretKeyFactory.getInstance(DESEDE_ENCRYPTION_SCHEME); Key key = skf.generateSecret(ks); Cipher cipher = Cipher.getInstance(DESEDE_ENCRYPTION_SCHEME); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] plainText = unencryptedString.getBytes(StandardCharsets.UTF_16); return cipher.doFinal(plainText); }
我完全不确定这是一个提供密钥的好方法 – 你在这里只限于2 个32键,这不是很好,即使你对此感到满意,为什么要为键而不是int
? 但至少代码编译,当它失败时它会正常失败。
在范围的开头声明变量,因为在try块中它甚至可能不存在。 所以你不能回报smth。 这可能不存在。
把它放在那里
String encryptedString = null; byte[] encryptedText
encrytpedText
只在try
块中有作用域。 尝试这个:
byte[] encrytpedText = null; try { cipher.init(Cipher.ENCRYPT_MODE, key); byte[] plainText = unencryptedString/*.getBytes(UNICODE_FORMAT)*/; encryptedText = cipher.doFinal(plainText); // encryptedString = new String(Base64.encodeBase64(encryptedText)); } catch (Exception e) { e.printStackTrace(); } return encryptedText;
适用于AES
所有长度128,192,256位加密。
只需更改KEY_LEN_IN_BITS
静态值即可。
开始了 –
private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; private static int ITERATIONS = 65536; private static SecretKey secretKey = null; final private static short KEY_LEN_IN_BITS = (short)128; final private static byte[] BUFFER = new byte[1024 * 64]; private static byte[] generateSalt() throws NoSuchAlgorithmException { Random random = SecureRandom.getInstance("SHA1PRNG"); byte[] salt = new byte[8]; random.nextBytes(salt); return salt; } static ArrayList