当前位置: 首页 > 知识库问答 >
问题:

Android:在Android中使用GCM模式的AES加解密?

西门靖琪
2023-03-14
    null
public void createKey() {
    try {
        if (!ks.containsAlias(keyName)) {

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
                Log.e("MAinAcvtivity", "Current version is 23(MashMello)");
                //Api level 23
                KeyGenerator generator  = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, "AndroidKeyStore");
                generator.init(
                        new KeyGenParameterSpec.Builder(keyName,
                                KeyProperties.PURPOSE_ENCRYPT | KeyProperties.PURPOSE_DECRYPT)
                                .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
                                .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
                                .build());
                SecretKey key = generator.generateKey();

            } else {
                Log.e("MAinAcvtivity", "Current version is < 23(MashMello)");

            }

        }else{
            Log.e("MAinAcvtivity", "Key exist");
        }
    } catch (Exception e) {

        Log.e("MAinAcvtivity", "Key didn't generated");
        Log.e("MAinAcvtivity", Log.getStackTraceString(e));
    }
}
public String doEncryption(String data) {
    try {

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            ce = Cipher.getInstance("AES/GCM/NoPadding");
            sKey = (SecretKey) ks.getKey(keyName, null);
            ce.init(Cipher.ENCRYPT_MODE, sKey);
        } else {

        }

        encodedData = ce.doFinal(data.getBytes());
        mEncodedData = Base64.encodeToString(encodedData, Base64.DEFAULT);
    } catch (Exception e) {
        Log.e("Main", "RSA Encription Error.!");
        Log.e("MainActivity", "RSA Decryption Error.!", e);
    }
    Log.e("Main", "encripted DATA =" + mEncodedData);
    return mEncodedData;
}

解密:

public String doDecryption(String eData) {
    String decryptedText = null;
encodedData = Base64.decode(eData, Base64.DEFAULT);

    try {
        Cipher c;
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            Log.i("MainActivity","in Decryption version m");

            c = Cipher.getInstance("AES/GCM/NoPadding");
            sKey = (SecretKey) ks.getKey(keyName, null);
            Log.e("MainActivity", "After getting key : " );
            c.init(Cipher.DECRYPT_MODE, sKey);
        } else {

        }

        decodedData = c.doFinal(encodedData);
        decryptedText = new String(decodedData, "UTF-8");
        Log.e("MainActivity", "After decryption : "+ decryptedText);
    } catch (Exception e) {
        Log.e("MainActivity", "RSA Decryption Error.!", e);
    }
    return decryptedText;
}

错误日志:

MAinAcvtivity: Key exist
Main: encripted DATA =KrHmMXhcytb0owDzLaMY2wsQmwY=
MainActivity: in decryption : encoded data =KrHmMXhcytb0owDzLaMY2wsQmwY=
MainActivity: After getting key : 
MainActivity: RSA Decryption Error.!
MainActivity: java.security.InvalidKeyException: IV required when     decrypting. Use IvParameterSpec or AlgorithmParameters to provide it.
MainActivity:     at android.security.keystore.AndroidKeyStoreAuthenticatedAESCipherSpi$GCM.initAlgorithmSpecificParameters(AndroidKeyStoreAuthenticatedAESCipherSpi.java:79)
MainActivity:     at android.security.keystore.AndroidKeyStoreCipherSpiBase.engineInit(AndroidKeyStoreCipherSpiBase.java:106)

共有1个答案

柴修筠
2023-03-14

宾古!

我找到解决办法了。

在解密中,我做了以下更改:

 GCMParameterSpec spec = new GCMParameterSpec(128,ce.getIV());
 c.init(Cipher.DECRYPT_MODE, sKey,spec);
 类似资料:
  • 我在加密过程中尝试了以下选项: 但这会引发以下错误:

  • 我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。 首先,我在Android中生成了对称密钥: 在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(PHP): PHP中的结果: 怎么啦?

  • 问题内容: 有没有一个很好的示例,说明如何在Android上使用AES 加密和解密图像及其他文件? 问题答案: 并像这样调用它们: 这应该可行,我现在在项目中使用类似的代码。

  • 我使用AES方法对从txt文件调用的sentance进行加密。我使用了GCM模式并创建了一个特定的密钥。一切都在工作(代码如下)。 我尝试实现解密过程,也就是说,我只有密钥(HexMyKeyvalue)和加密消息(HexEncryptedOriginalMessage value)并且我想对其进行解密。但问题是我错过了一些东西... 我写了下面的代码,但我有错误消息。 TypeError:decr

  • 但这总是给我以下的例外- 我的键盘生成逻辑- 我的加密逻辑- Base64 Util方法-

  • 首先,我已经成功地使用Java(JDK 8)编写了使用进行加密和解密的代码。 但我想知道这是否是AES,那么如何使用GCM这样的模式来检查完整性。 另一方面,我能够将与结合使用。表示密钥是使用带有HMACSHA256的PBKDF2生成的,用于AES/GCM。 > 但我正在努力寻找使用生成密钥的源代码,并使用AES/GCM,或者即使这是可能的,或者它是否有意义? 其次,使用PBEWithHmacSH