Java 256位AES加密
基本上,我正在做的是编写一个程序,该程序将加密通过TCP /
IP发送的请求,然后由服务器程序解密。加密将需要是AES,并且进行一些研究后发现我需要使用CBC和PKCS5Padding。所以基本上我也需要一个秘密密钥和一个IV。
我正在开发的应用程序是用于手机的,因此我想使用Java安全包来减小尺寸。我已经完成了设计,但是不确定IV和共享密钥的实现。
这是一些代码:
// My user name
byte[] loginId = "login".getBytes();
byte[] preSharedKey128 = "ACME-1234AC".getBytes();
byte[] preSharedKey192 = "ACME-1234ACME-1234A".getBytes();
// 256 bit key
byte[] preSharedKey256 = "ACME-1234ACME-1234ACME-1234".getBytes();
byte[] preSharedKey = preSharedKey256;
// Initialization Vector
// Required for CBC
byte[] iv ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
IvParameterSpec ips = new IvParameterSpec(iv);
byte[] encodedKey = new byte[loginId.length + preSharedKey.length];
System.arraycopy(loginId, 0, encodedKey, 0, loginId.length);
System.arraycopy(preSharedKey, 0, encodedKey, loginId.length, preSharedKey.length);
// The SecretKeySpec provides a mechanism for application-specific generation
// of cryptography keys for consumption by the Java Crypto classes.
// Create a key specification first, based on our key input.
SecretKey aesKey = new SecretKeySpec(encodedKey, "AES");
// Create a Cipher for encrypting the data using the key we created.
Cipher encryptCipher;
encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Initialize the Cipher with key and parameters
encryptCipher.init(Cipher.ENCRYPT_MODE, aesKey, ips);
// Our cleartext
String clearString = "33,8244000,9999,411,5012022517,0.00,0,1,V330";
byte[] cleartext = clearString.getBytes();
// Encrypt the cleartext
byte[] ciphertext = encryptCipher.doFinal(cleartext);
// Now decrypt back again...
// Decryption cipher
Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
// Initialize PBE Cipher with key and parameters
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey, ips);
// Decrypt the cleartext
byte[] deciphertext = decryptCipher.doFinal(ciphertext);
简而言之,它应该对服务器可以解密的某些消息进行加密,而无需服务器从电话中获取密钥或IV。有什么方法可以保护电话上的IV和密钥,并使服务器仍然知道密钥和IV?随意告诉我,如果不是的话,让它们变得更加清晰。
代码有一些问题。首先,您确实应该使用密钥生成器来生成秘密密钥。对于某些算法,仅直接使用一些文本可能会起作用,但是其他算法的键较弱,因此需要进行测试。
即使您要进行基于密码的加密,也应该通过密钥派生算法来运行密码,以产生密钥,如我)对您已经提到的问题的回答所示。
另外,您不应使用的no-arg getBytes()
方法String
。这取决于平台。如果您要编码的所有字符串仅包含来自US-
ASCII字符集的字符,请通过明确指定该编码来使其清楚。否则,如果电话和服务器平台使用不同的字符编码,则密钥和IV的结果将不同。
对于CBC模式,最好对您发送的每条消息使用新的IV。通常,CBC IV是随机生成的。CFB和OFB等其他模式 要求 每条消息 都
具有唯一的IV。IV通常与密文一起发送-IV不需要保密,但是如果使用可预测的IV,许多算法都会中断。
服务器不需要直接从电话获取机密或IV。您 可以 使用密钥(或从中派生密钥的密码)配置服务器,但是在许多应用程序中,这将是一个糟糕的设计。
例如,如果要将应用程序部署到多人的电话中,那么对于他们来说使用相同的密钥并不是一个好主意。一个恶意用户可以找回密钥并破坏每个人的系统。
更好的方法是在电话上生成新的秘密密钥,并使用密钥协商算法与服务器交换密钥。为此,可以使用Diffie-
Hellman密钥协议,也可以使用RSA加密秘密密钥并将其发送到服务器。
更新:
只要服务器的公用密钥嵌入到应用程序中,就无需从服务器到电话的初始消息,就可以在“短暂静态”模式(也不太希望使用“静态-静态”模式)中的Diffie-
Hellman。 。
服务器公用密钥不会像在电话中嵌入公用密钥那样带来相同的风险。由于它是公共密钥,因此威胁可能是攻击者将其伸手(或远程入侵)电话并用伪造的密钥替换真实的公共密钥,从而使他可以模拟服务器。
可以使用静态-
静态模式,但实际上更复杂,安全性稍差。每个电话都需要自己唯一的密钥对,否则您将陷入秘密密钥问题。至少服务器不需要跟踪哪个手机具有哪个密钥(假设在应用程序级别上有某种身份验证机制,例如密码)。
我不知道手机有多快。在我的桌面上,生成临时密钥对大约需要1/3秒。生成Diffie-Hellman参数非常缓慢;您肯定要重复使用服务器密钥中的参数。
我只需要通过代码加密AES CBC 128位模式的字符串。我使用openssl库完成了这项工作,但无法获得正确的输出。 到目前为止,我已经完成了。 我的十六进制输出是:B0 15 751B50 80 D4 FF 81 68 146BB71B95 99 37 38 但正确的输出是:< code > 73 5C 04 F9 57 18 43 7C EE 68 27 59 2B 41 A8 DA (通过
我只想用这3种模式测试openSSL中的AES:128192和256密钥长度,但我解密的文本与我的输入不同,我不知道为什么。此外,当我传递一个巨大的输入长度(比如1024字节)时,我的程序显示。。。我的意见总是一样的,但这并不重要,至少现在是这样。代码如下: 编辑: 当我将输出大小更改为而不是时,我得到了结果: 那么,是否有可能存在Outpus大小和IV大小的问题?它们应该有什么尺寸(AES-CB
我有一个Python应用程序和PHP网站,通过一些特定的网络层发送消息进行通信。我的任务是使用该通道发送所有AES加密和Base64编码的消息。加密密钥是为双方手动预共享的。 在PHP中,我使用以下代码创建名为的最终消息文本: 我在我的Python应用程序中收到这样的消息,去掉了魔力,得到了base64字节的数据。我找不到一个示例来使兼容的AES密码来解码此消息的问题。 Key和“Magic”只是
下面是我到现在为止所尝试的 下面是适用于我的node.js代码。在CryptoJ中,我没有成功地实现类似的功能。根据我的理解,crypto是内置库,其中的节点在其上有自己的包装器。
我最近在Java中使用了AES CBC 128算法来加密数据。现在我需要用PHP重建算法,但我不知道如何重建,因为互联网上的PHP算法返回不同的结果。也许你能帮我。 这是要加密的Java代码: 这是我的php代码: 当我从java加密加密数据时,此结果无法在Php解密上解密。 你们能帮我构建一个PHP脚本吗?它可以返回与java加密相同的结果?
我希望有一个用C编写的程序,可以在没有openssl这样的大型库的帮助下,用AES-CBC对字符串进行编码/解码。 目标: 使用密码短语对字符串进行编码/解码: 因此,应用程序需要接受3个输入参数。。。 输入字符串(待编码)/或已编码字符串(待解码) 用于编码/解码字符串的密码 编码或解码指示器 我对C语言不熟悉(我可以用C#编码)。 我已经找到了https://github.com/kokke/