
代码如下,但首先要注意一些事项。
- 必须为每个消息选择一个不同的初始化向量。硬编码初始化向量没有任何意义。IV应该与密文一起发送给消息接收者(这不是秘密)。
- 我将自己的实用程序类用于base-64编码。您可以使用
sun.misc.base64Enprer
,sun.misc.base64Deprer
而是使用BouncyCastle之类的第三方库,或者编写自己的库。 - 您正在使用2键三重DES,其中第一键和第三键相同。我进行了修改
sharedkey
以反映这一点,因为Java DESede密码始终需要192位密钥。由密钥生成器来处理密钥选项。 - CBC IV只有64位。我只使用的前64位
sharedvector
。
此类应与C#版本互 *** 作。
import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;public class Encryption{ private static byte[] sharedkey = { 0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11, 0x12, 0x11, 0x0D, 0x0B, 0x07, 0x02, 0x04, 0x08, 0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11 }; private static byte[] sharedvector = { 0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11 }; public static void main(String... argv) throws Exception { String plaintext = "userNameHere:passwordHere"; String ciphertext = encrypt(plaintext); System.out.println(ciphertext); System.out.println(decrypt(ciphertext)); } public static String encrypt(String plaintext) throws Exception { Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding"); c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector)); byte[] encrypted = c.doFinal(plaintext.getBytes("UTF-8")); return base64.enpre(encrypted); } public static String decrypt(String ciphertext) throws Exception { Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding"); c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector)); byte[] decrypted = c.doFinal(base64.depre(ciphertext)); return new String(decrypted, "UTF-8"); }}输出:
zQPZgQHpjxR + 41Bc6 + 2Bvqo7 + pQAxBBVN + 0V1tRXcOc =
userNameHere:passwordHere
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)