在Android/Java平台上加密共享密钥
我对Android平台和加密技术都很陌生,所以请耐心听我说。我需要调用一个webservice,它要求我在调用参数之前对参数进行加密。我已收到一份说明,内容如下:
“我们使用AES进行加密。加密设置如下:
密钥:PublicKey12345678910
位数:128
填充:PKCS#7
密码:密码块链接(CBC)“
现在,我的问题可能是对加密过程缺乏基本了解。我有我的公钥,但我该怎么用它呢?我曾试图在网上找到答案,但我所有的努力似乎都会导致加密密钥错误,或者经常导致“无效密钥长度异常,密钥不是128、196或256位”(或者其他类似情况)。我最近的努力,主要借鉴了stack上的一个答案,如下所示:
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 楼答案
暂时忘掉实现细节,让我们把重点放在更高层次上。如果您以这种方式执行加密,您的私钥将以易于提取的方式存储在程序或程序使用的数据中的某个位置,从而影响加密
相比之下,如果您使用HTTPS(这是创建加密会话的一种非常标准的方法),则将有一个经过充分测试和研究的过程,即使用非对称密码建立私钥,然后使用私钥创建加密通道(通常使用128位AES加密)
你真的应该让为你提供此Web服务的人通过标准HTTPS连接提供加密服务,而不是依赖于像这样对单个字段进行加密