【问题标题】:Looking for an encrypt/decrypt AES example for Android寻找适用于 Android 的加密/解密 AES 示例
【发布时间】:2016-09-21 03:06:30
【问题描述】:

由于我是加密新手,尤其是 Java/Android 方面的新手,我正在努力寻找可以正常工作的教程和代码,以便我可以从中学习但结果。

如本站:https://www.owasp.org/index.php/Using_the_Java_Cryptographic_Extensions

我找不到BASE64Encoder 类对我造成影响的问题,它似乎在 sun.utils 包中,但我可以找到 Base64 类,但我无法调整代码以便它可以为我工作.

这个也一样

android encryption/decryption with AES

加密是在Bitmap Image 中完成的,我无法在普通文本字符串中实现相同的技术。

有人会在Android中提供一个简单的AES加密/解密示例,仅展示如何使用密钥、消息、加密和解密吗?

【问题讨论】:

  • 这是登录还是其他?
  • 这是为了在资源中离线隐藏一些受严格版权保护且需求量很大的数据
  • 这个问题是/是题外话,因为它要求一个例子。然而,它似乎也是重复的of this question

标签: java android encryption aes


【解决方案1】:

第二个例子应该适用于文本字符串。替换

byte[] b = baos.toByteArray();

byte[] b = yourString.getBytes();

请注意,您必须以某种方式存储密钥,因为在某些时候必须破译

存储在设备上并不是一个好主意,因为您将钥匙留在了门上。您可以存储在您的服务器上或使用密码(固定或询问用户)。我给你最后一个选项的真实样本

private static String getPassphraseSize16(String key) {
    if (TextUtils.isEmpty(key)) {
        return null;
    }
    char controlChar = '\u0014';
    String key16 = key + controlChar;
    if (key16.length() < 16) {
        while (key16.length() < 16) {
            key16 += key + controlChar;
        }
    }
    if (key16.length() > 16) {
        key16 = key16.substring(key16.length() - 16, key16.length());
    }
    return key16;
}


public static byte[] encodeAES(byte[] message, String passphrase) {
    String passphrase16 = getPassphraseSize16(passphrase);
    SecretKeySpec secretKey = new SecretKeySpec(passphrase16.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    byte[] encodedText = cipher.doFinal(message);

    return encodedText;
}


public static byte[] decodeAES(byte[] encodedMessage, String key) {
    String passphrase16 = getPassphraseSize16(key);
    SecretKeySpec secretKey = new SecretKeySpec(passphrase16.getBytes(), "AES");
    Cipher cipher = Cipher.getInstance("AES");
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    byte[] decodedText = cipher.doFinal(encodedMessage);

    return decodedText;
}

这个例子和https://github.com/scottyab/AESCrypt-Android提供的类似

【讨论】:

    【解决方案2】:

    我已将它用于我的项目。

    'com.scottyab:aescrypt:0.0.1'(ref: [enter link description here][1]
    

    加密:

    String encryptedMsg = AESCrypt.encrypt(password, message);
    

    解密:

    String messageAfterDecrypt = AESCrypt.decrypt(password, encryptedMsg);
    

    如果您更关心安全性,请使用 SHA1 或 SHA256。 希望这会有所帮助。

    编辑: 就我而言,我必须加密登录密码并通过网络将其发送到服务器。

    String userPassword = password.getText().toString();
    try {
            encryptedMsg = AESCrypt.encrypt(userPassword, Config.secretlogin);
       } catch (GeneralSecurityException e) {
            e.printStackTrace();
       }
    

    所以在后端,我已经用密钥解密了安全密码,并且在双方我都使用相同的 AES(Android 和后端)。

    【讨论】:

    • 我试过了,但是当我尝试解密使用 AES 在线加密加密的数据时,它显示错误的填充异常 1.我使用 aesencryption.net 加密了字符串 2.我使用你提到的图书馆。 3.加密后的数据不一样 4.android studio在解密时显示javax.crypto.BadPaddingException: error:1e06b065:Cipher functions:EVP_DecryptFinal_ex:BAD_DECRYPT异常
    • 让我用我在案例中尝试过的内容编辑我的答案。
    • 这是一个已弃用的存储库
    • 很高兴你提到它,你能在这里更新一下最新版本吗?
    【解决方案3】:

    加密和解密过程在以下情况下运行良好: 我替换了从以下获得的字节数组:

    Bitmap byte array of message string 按照

    中的说明

    android encryption/decryption with AES

    所以即使我的问题没有完全解决,这个问题也应该标记为已回答。

    【讨论】:

      【解决方案4】:

      我找不到 BASE64Encoder 类遇到的问题, 这似乎在一个 sun.utils 包内,但我可以找到 Base64 类,但我无法调整代码以便它可以为我工作。

      您可能没有为 Base64 使用正确的库。您提到sun.utils,您发送的链接正在使用:

      import org.apache.commons.codec.binary.Base64;
      

      Java 8 开始,您可以使用 java.util.Base64,详情请参阅 Oracle 文档 here。它支持基本编码、URL 编码和 MIME 编码。您可以在this tutorial 中找到一些示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-09-22
        • 2011-05-13
        • 2014-04-07
        • 1970-01-01
        • 2020-04-28
        • 2011-10-12
        • 1970-01-01
        相关资源
        最近更新 更多