加密Android / Java平台上的共享密钥

时间:2011-07-04 09:37:43

标签: java android encryption aes

我对Android平台和加密都很新,所以请耐心等待。我需要调用一个webservice,它要求我在调用之前加密一个参数。我收到的说明如下:

“我们使用AES加密。加密的设置如下:

  • Key:PublicKey12345678910

  • 位数:128

  • 填充:PKCS#7

  • Cipher:Cipher Block Chaining(CBC)“

现在,我的问题可能是缺乏对加密过程的基本了解。我有我的公钥,但我该怎么办呢?我试图在网上找到答案,但我所有的努力似乎都导致错误的加密密钥或经常是“InvalidKeyLengthException,密钥不是128,196或256位”(或者那个大致方向的东西)。我最近的努力,从堆栈上的答案中大量借用,看起来像这样:

            String input = "TheParameterIWantToEncrypt";
        String secretID = "PublicKey12345678910";
        char[] inputChars = input.toCharArray();
        char[] pswChars = secretID.toCharArray();

        SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithMD5AndDES", new BouncyCastleProvider());
        KeySpec spec = new PBEKeySpec(pswChars);
        SecretKey tmp = factory.generateSecret(spec);
        SecretKey secret = new SecretKeySpec(tmp.getEncoded(), "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secret);
        AlgorithmParameters params = cipher.getParameters();
        byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();
        byte[] ciphertext = cipher.doFinal(input.getBytes());

        System.out.println(new String(ciphertext));

有人可以向我解释在提供的规范中以何种顺序执行操作?此外,在Java / Android平台上实现此行为的任何代码也都非常有用。

1 个答案:

答案 0 :(得分:1)

暂时忘掉实施细节,让我们专注于更高层次的事情。如果以这种方式执行加密,您的私钥将以可轻松提取的方式存储在程序中的某个位置或程序使用的数据中,从而危及加密。

相比之下,如果你使用HTTPS(这是一种非常标准的方式来创建加密会话),那么将会有一个经过充分测试和充分研究的过程,其中使用非对称密码来建立私钥然后用于创建加密通道(通常使用128位AES加密)。

您应该真正推迟向您提供此Web服务的人通过标准HTTPS连接提供加密,而不是依赖于加密这样的单个字段。