首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android AES加密/解密忽略密码

Android AES加密/解密忽略密码
EN

Stack Overflow用户
提问于 2014-10-24 10:31:09
回答 1查看 670关注 0票数 0

我想制作一个简单的应用程序,用AES加密/解密消息。我的代码现在似乎工作,因为我得到的文本加密和解密没有任何问题。

我有一个输入字段,一个输入解密/加密密码的字段和一个输出字段。和两个按钮(加密/解密)。

问题是*,当我输入一条消息并设置密码并对其进行加密,然后尝试引发无效的密码泄漏时,消息将解密,尽管输入的密码与我用于加密的密码不匹配。

这里是我的密钥生成代码:

代码语言:javascript
复制
public void vers(){
    // Das Passwort bzw der Schluesseltext
    keyStr = keyedit.getText().toString();
    // byte-Array erzeugen

    try {
        key = (keyStr).getBytes("UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    // aus dem Array einen Hash-Wert erzeugen mit MD5 oder SHA

    try {
        sha = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    key = sha.digest(key);
    // nur die ersten 128 bit nutzen
    key = Arrays.copyOf(key, 16); 
    // der fertige Schluessel
    secretKeySpec = new SecretKeySpec(key, "AES");
}

,这里是我加密消息的代码:

代码语言:javascript
复制
private void codealgo() {

    vers();

    // der zu verschl. Text
    text1 = input.getText().toString();


    // Verschluesseln

    try {
        cipher = Cipher.getInstance("AES");
    } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        encrypted = cipher.doFinal(text1.getBytes());
    } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (BadPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    // bytes zu Base64-String konvertieren (dient der Lesbarkeit)
    geheim = Base64.encodeToString(encrypted, Base64.NO_WRAP);


    // Ergebnis
    output.setText(geheim);

}

,至少在这里,我尝试再次解密消息的代码:

代码语言:javascript
复制
private void decodealgo() {

        vers();

        geheim2 = input.getText().toString();

    // BASE64 String zu Byte-Array konvertieren
    data = Base64.decode(geheim2, Base64.NO_WRAP);


    // Entschluesseln

    try {
        cipher3 = Cipher.getInstance("AES");
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        cipher3.init(Cipher.DECRYPT_MODE, secretKeySpec2);
    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        Toast.makeText(getApplicationContext(), "Invalid key",
        Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }

    try {
        cipherData3 = cipher3.doFinal(data);
    } catch (IllegalBlockSizeException e) {
        // TODO Auto-generated catch block
        Toast.makeText(getApplicationContext(), "No valid encryption",
        Toast.LENGTH_SHORT).show();
    } catch (BadPaddingException e) {
        // TODO Auto-generated catch block
        Toast.makeText(getApplicationContext(), "Key invalid format",
        Toast.LENGTH_SHORT).show();
        e.printStackTrace();
    }

    try {
        text3 = new String(cipherData3, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    // Klartext
    output.setText(text3);

}

请告诉我为什么密码被解密过程忽略,为什么一个随机条目显示用密码加密的消息。

非常感谢您提前!

EN

回答 1

Stack Overflow用户

发布于 2014-10-25 11:15:44

您似乎将字段用于几乎任何变量。您可以将其等同于为应用程序使用全局变量,尽管这是在类级别上执行的。应尽量减少类的字段数量(尽管不应将同一字段用于多种用途)。相反,您应该将局部变量用于不需要在方法之间共享的任何内容。

例如,当前所有关键相关变量都是字段。最后,您只需要一个SecretKey实例来加密/解密,所以所有这些变量都应该在本地vars中(不过,将密钥派生放在单独的方法中很好)。此外,您应该只使用键作为encryptdecrypt方法的参数。这样,您就不可能突然将某个字段保留为以前的值。共享Cipher实例总是一个坏主意,特别是当您不能保证使用相同的密钥时。

最后,请注意,"AES/ECB/PKCS5Padding" ( Cipher.getInstance("AES") 可能暗示的那样)可能会抛出BadPaddingException,但即使密钥或密文不正确,也不能保证这一点。为了保证密文的完整性和真实性,您必须在密文上使用(H)MAC。欧洲央行模式本身只提供一定程度的机密性。可能最简单的方法是为您切换到GCM模式加密。

最后,密码不是密钥,搜索PBKDF2以获得更多信息。不要使用MD5。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26546208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档