1

所以我有一个 android 应用程序和一个用 python 编写的谷歌应用程序引擎服务器。android 应用程序需要向服务器发送一些有意义的信息,而我这样做的方式是通过 http 发布。

现在我一直在考虑在发送数据之前在android中加密数据,一旦它在gae服务器上就解密它。

这就是我在java中加密和解密的方式:

private static final String ALGO = "AES";



public static String encrypt(String Data) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.ENCRYPT_MODE, key);
        byte[] encVal = c.doFinal(Data.getBytes());
     //   String encryptedValue = new BASE64Encoder().encode(encVal);

        byte[] decoded = Base64.encodeBase64(encVal);

        return (new String(decoded, "UTF-8") + "\n");
    }

public static String decrypt(String encryptedData) throws Exception {
        Key key = generateKey();
        Cipher c = Cipher.getInstance(ALGO);
        c.init(Cipher.DECRYPT_MODE, key);
        byte[] decordedValue =Base64.decodeBase64(encryptedData);
        byte[] decValue = c.doFinal(decordedValue);
        String decryptedValue = new String(decValue);

        return decryptedValue;

    }

    private static Key generateKey() throws Exception {
        Key key = new SecretKeySpec(Constant.keyValue, ALGO);
        return key;
    }

这就是我尝试在服务器上解密的方式(我还不知道如何进行加密......也许你们也可以帮忙)

def decrypt(value):
    key = b'1234567891234567'

    cipher = AES.new(key, AES.MODE_ECB)
    msg = cipher.decrypt(value)

    return msg

当我查看日志时,我得到的字符串测试是:xVF79DzOplxBTMCwAx+hoeDJhyhifPZEoACQJcFhrXA=并且因为它不是 16 的倍数(为什么,我猜这是因为 java 加密)我得到了错误

ValueError:输入字符串的长度必须是 16 的倍数

我究竟做错了什么?

4

2 回答 2

2

你为什么不使用 ssl(又名 https)?这应该提供在手机和 App Engine 之间安全、私密地传输数据所需的所有加密。

它的基础知识:不是将数据发送到http://yourapp.appspot.com/,而是将其发送到https://yourapp.appspot.com/

要在 App Engine 和 Android 之间建立完整的安全且经过身份验证的通道,您可以使用 Google Cloud Endpoints。它甚至会生成 Android 端代码来调用它。

爪哇:

Python:

如需更长的节目和讲述,请查看 IO 13 演讲:https ://www.youtube.com/watch?v=v5u_Owtbfew

于 2013-06-19T18:22:36.407 回答
0

这个字符串“xVF79DzOplxBTMCwAx+hoeDJhyhifPZEoACQJcFhrXA=”是一个base64编码的值。

https://en.wikipedia.org/wiki/Base64

Base64 编码被广泛用于许多应用程序,它是将二进制数据编码为文本的好方法。如果您正在查看长编码值,则末尾的“=”可以很好地指示 base64 编码。

在您的 python 代码中,您可能需要在将数据交给解密函数之前对数据进行 base64 解码。

我有两个建议:

  1. 如果加密对您来说不是一个舒适区,请咨询在该领域擅长您的项目的人。

  2. 请注意,在您分发的 Android 应用程序中嵌入对称加密密钥是一个坏主意。任何可以获得您的应用程序副本的人都可以提取该密钥并使用它来解密或欺骗您的消息。

于 2013-06-19T17:34:21.203 回答