我正在尝试加密服务器上发送的语音文件。我使用以下过程:
将语音记录到文件>将文件转换为字节数组>用生成的密钥加密字节数组>将密钥保存到字符串>上载字节数组>从服务器加载文件>将其转换为字节数组>用生成的密钥解密<--这里,我得到一个错误
javax.crypto.AEADBadTagException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT
2019-07-02 17:20:51.771 25417-25448/cz.magician.justtalk W/System.err: at java.lang.reflect.Constructor.newInstance0(Native Method)
2019-07-02 17:20:51.771 25417-25448/cz.magician.justtalk W/System.err: at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
2019-07-02 17:20:51.771 25417-25448/cz.magician.justtalk W/System.err: at com.android.org.conscrypt.OpenSSLCipher$EVP_AEAD.throwAEADBadTagExceptionIfAvailable(OpenSSLCipher.java:1200)
2019-07-02 17:20:51.771 25417-25448/cz.magician.justtalk W/System.err: at com.android.org.conscrypt.OpenSSLCipher$EVP_AEAD.doFinalInternal(OpenSSLCipher.java:1229)
2019-07-02 17:20:51.771 25417-25448/cz.magician.justtalk W/System.err: at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:363)
2019-07-02 17:20:51.771 25417-25448/cz.magician.justtalk W/System.err: at javax.crypto.Cipher.doFinal(Cipher.java:2055)
package xxx;
import android.util.Base64;
import javax.crypto.*;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.ByteBuffer;
import java.security.SecureRandom;
public class EncryptionUtility {
//File encryption
public static byte[] encryptData(SecretKey secretKey, byte[] data) throws Exception {
SecureRandom secureRandom = new SecureRandom();
byte[] iv = new byte[12];
secureRandom.nextBytes(iv);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, parameterSpec);
byte [] encryptedData = cipher.doFinal(data);
ByteBuffer byteBuffer = ByteBuffer.allocate(4 + iv.length + encryptedData.length);
byteBuffer.putInt(iv.length);
byteBuffer.put(iv);
byteBuffer.put(encryptedData);
return byteBuffer.array();
}
//File decryption
public static byte[] decryptData(SecretKey secretKey, byte[] encryptedData) throws Exception {
ByteBuffer byteBuffer = ByteBuffer.wrap(encryptedData);
int noonceSize = byteBuffer.getInt();
if(noonceSize < 12 || noonceSize >= 16)
throw new IllegalArgumentException("Nonce size is incorrect. Make sure that the incoming data is an AES encrypted file.");
byte[] iv = new byte[noonceSize];
byteBuffer.get(iv);
byte[] cipherBytes = new byte[byteBuffer.remaining()];
byteBuffer.get(cipherBytes);
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");
GCMParameterSpec parameterSpec = new GCMParameterSpec(128, iv);
cipher.init(Cipher.DECRYPT_MODE, secretKey, parameterSpec);
return cipher.doFinal(cipherBytes);
}
//Internal - SecretKey
public static SecretKey generateSecretKey() {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
return kgen.generateKey();
}
catch (Exception exc){
exc.printStackTrace();
return null;
}
}
public static String parseSecretKeyToString(SecretKey secretKey){
return Base64.encodeToString(secretKey.getEncoded(), 0);
}
public static SecretKey parseStringToSecretKey(String secretKeyString){
try {
return new SecretKeySpec(Base64.decode(secretKeyString, 0), 0, 16, "AES");
}
catch (Exception exc){
return null;
}
}
}
SecretKey key = EncryptionUtility.generateSecretKey();
String keyStr = EncryptionUtility.parseSecretKeyToString(key);
fileBytes.put(param, EncryptionUtility.encryptData(key, readToBytes(file)));
new AsyncTask<Void, Void, byte[]>(){
@Override
protected byte[] doInBackground(Void... voids) {
try {
URLConnection connection = new URL("urltovoicefile").openConnection();
InputStream inputStream = connection.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b;
while ((b = inputStream.read()) != -1){
baos.write(b);
}
byte[] result = baos.toByteArray();
return EncryptionUtility.decryptData(EncryptionUtility.parseStringToSecretKey(keyStr), result);
}
catch (Exception exc){
exc.printStackTrace();
}
return new byte[0];
}
@Override
protected void onPostExecute(byte[] result) {
try {
File file = new File(activity.getCacheDir().toString(), "read.m4a");
FileOutputStream out = new FileOutputStream(file);
out.write(result);
out.close();
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setDataSource(file.getAbsolutePath());
mediaPlayer.prepare();
mediaPlayer.start();
}
catch (Exception exc){
exc.printStackTrace();
}
}
}.execute();
/**
* Adds a upload file section to the request
*/
public void addFile(String fieldName, String fileName, byte[] fileBytes)
throws IOException {
writer.append("--" + boundary).append(LINE_FEED);
writer.append("Content-Disposition: form-data; name=\"" + fieldName
+ "\"; filename=\"" + fileName + "\"")
.append(LINE_FEED);
writer.append(
"Content-Type: " + URLConnection.guessContentTypeFromName(fileName))
.append(LINE_FEED);
writer.append("Content-Transfer-Encoding: binary").append(LINE_FEED);
writer.append(LINE_FEED);
writer.flush();
outputStream.write(fileBytes);
outputStream.flush();
writer.append(LINE_FEED);
writer.flush();
}
/**
* Completes the request and receives response from the server.
* @return a list of Strings as response in case the server returned
* status OK, otherwise an exception is thrown.
*/
public String finish() throws IOException {
String response;
writer.append(LINE_FEED).flush(); //**THIS WAS ALREADY BEING ADDED BY uploadFile**
writer.append("--" + boundary + "--").append(LINE_FEED);
writer.close();
int status = httpConn.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
BufferedInputStream in = new BufferedInputStream(httpConn.getInputStream());
response = inputStreamToString(in);
httpConn.disconnect();
}
else
throw new IOException("Server returned non-OK status: " + status);
return response;
}
最后,问题出在我上传文件的工具上。我在每个文件后面添加了一个CR/LF,然后在请求的末尾添加了一个额外的CR/LF。删除它解决了问题。
我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。 首先,我在Android中生成了对称密钥: 在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(PHP): PHP中的结果: 怎么啦?
我从后端服务器得到一个加密的字符串,我需要使用Android中的私钥来解密。解密是有效的,但它在解密字符串的末尾附加了一个特殊的字符。下面是我正在使用的代码: 解密的字符串应该以“==”结尾。有人能帮我弄清楚,如何删除解密字符串结尾的特殊字符。 谢谢
OpenSSL提供了一个流行的(但不安全-请参见下面!)AES加密的命令行界面: Python以PyCrypto包的形式支持AES,但它只提供了工具。如何使用Python/Pycrypto解密已经使用OpenSSL加密的文件? 这个问题过去也涉及使用相同方案在Python中进行加密。我已经删除了这部分,以阻止任何人使用它。不要再用这种方式加密任何数据,因为按照今天的标准,它是不安全的。您应该只使用
问题内容: 因此,我正在为自己开发一个个人项目,并且正在尝试加密手机上的文件。这些文件可以是任何文件,例如文档,照片等。现在,我正在尝试使其正常运行。每当我运行加密时,它似乎都可以正常工作并加密文件。当我运行解密时,有时它可以工作,而其他时候则不起作用。当它失败时,我通常会收到“在确定密码时出错,填充块已损坏”错误。我也没有使用不同的测试文件,所以它不像某些文件可以工作,而其他文件则不能。我每次都
我尝试在android中加密,在nodejs服务器中解密。我生成了一个AES 128位密钥,并使用AES算法对其进行加密,然后使用RSA算法对生成的密钥进行加密。然后将两者都发送到服务器。但是在服务器端解密时,我认为RSA解密工作正常,但在AES解密中有一个问题。我在服务器端没有收到我在客户端加密的字符串。 这是android端加密的代码: 然后把这个发到服务器端 服务器端的代码如下所示: 这里的
我在php中用AES加密法加密了文件,代码如下。 现在我正在尝试在Android中解密它,但我总是面临InvalidKey异常:密钥长度不是128/192/256位错误。这是Android代码: 有人能建议我怎么做吗?任何帮助都将不胜感激。