返回字节数组时出错

我使用以下代码

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 encrypt256(final FileInputStream fis, final String encryptFileTarget, final String fileTitle, final String keyVal) throws Exception{ final ArrayList encryptInfo = new ArrayList(); try{ byte[] saltBytes = new byte[8]; saltBytes = generateSalt(); SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); KeySpec spec = new PBEKeySpec(keyVal.toCharArray(), saltBytes, ITERATIONS, KEY_LEN_IN_BITS); secretKey = skf.generateSecret(spec); SecretKey secret = new SecretKeySpec(secretKey.getEncoded(), "AES");//"ISO-8859-1" Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secret); AlgorithmParameters params = cipher.getParameters (); byte[] initIVVector = params.getParameterSpec (IvParameterSpec.class).getIV(); FileOutputStream fos = new FileOutputStream(encryptFileTarget, true); CipherOutputStream cos = new CipherOutputStream(fos, cipher); InputStream is = new BufferedInputStream(fis); int bytesRead = -1; int count = 0; while((bytesRead = is.read(BUFFER)) != -1){ //System.out.println("bytesRead values is : " + bytesRead); cos.write(BUFFER, 0, bytesRead); } cos.flush(); cos.close(); is.close(); fos.flush(); fos.close(); fis.close(); encryptInfo.add(Hex.encodeHexString(initIVVector)); encryptInfo.add(Hex.encodeHexString(saltBytes)); }catch(Exception exp){ exp.printStackTrace(); } return encryptInfo; }