最近在做一个小小的对称加解密工具,需要跨Java和.NET。
本来想着这东西都有规范的,按理说不应该跟语言有关:大家都简单用下SDK的api,然后他们自己会懂的。
可是还是有点小小的意外,记上一笔,以作后续参考。
1. 我本来打算用DES,简单就好了,别太复杂,后来发现两者鸡跟鸭讲(why?),互相一直认识不了,就简单改成了3DES(无非是getInstance的时候改几个字符而已了)。
2. Key一定要24个字符,然后getBytes。
3. IV用8个byte就好了,为了用IV,CBC就不错
4. Padding我以为一定要弄NoPadding,其实我发现用java默认的PKCS5Padding就很好NoPadding(post comment: 如果用PKCS5Padding而不是NoPadding,会导致.NET加密的在java上无法解密,但奇怪的是java到.net方向却没有问题。再次why?),而.net用Zeros。
下面是关键代码,附上:
1. Java
初始化部分:
//KEY=UE9XRVIgQlkgQlJJR0hUIFpI
byte[] key = Constants.SECURITY__KEY.getBytes("UTF-8");
//iv=byte[8]{...}
IvParameterSpec ips = new IvParameterSpec(iv);
SecretKeySpec keySpec = new SecretKeySpec(key, "DESede");
//encodeClipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
encodeClipher = Cipher.getInstance("DESede/CBC/NoPadding");
encodeClipher.init(Cipher.ENCRYPT_MODE, keySpec, ips);
//decodeClipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
encodeClipher = Cipher.getInstance("DESede/CBC/NoPadding");
decodeClipher.init(Cipher.DECRYPT_MODE, keySpec, ips);
加密部分:
//date=byte[]
byte[] encryptedData= encodeClipher.doFinal(data);
解密部分:
//data=byte[]
byte[] decryptedData= decodeClipher.doFinal(data);
2. .NET
加密部分:
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = inputKey;
des.IV = ivArray;
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.Zeros;
ICryptoTransform transform = des.CreateEncryptor(des.Key, des.IV);
MemoryStream mem = new MemoryStream();
CryptoStream encStream = new CryptoStream(mem, transform, CryptoStreamMode.Write);
encStream.Write(plainData, 0, plainData.Length);
byte[] ciphertext = mem.ToArray();
encStream.Dispose();
mem.Dispose();
解密部分:
TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
des.Key = inputKey;
des.IV = ivArray;
des.Mode = CipherMode.CBC;
des.Padding = PaddingMode.Zeros;
ICryptoTransform transform = des.CreateDecryptor(des.Key, des.IV);
MemoryStream memDecryptStream = new MemoryStream();
CryptoStream cs_decrypt = new CryptoStream(memDecryptStream, transform, CryptoStreamMode.Write);
cs_decrypt.Write(ciphertext, 0, ciphertext.Length);
byte[] plaintext = memDecryptStream.ToArray();
cs_decrypt.Close();
memDecryptStream.Dispose();
可参考:
http://docs.oracle.com/javase/1.4.2/docs/guide/security/jce/JCERefGuide.html
http://docstore.mik.ua/orelly/java-ent/security/ch13_05.htm
http://www.jensign.com/JavaScience/dotnet/NetDESEncrypt/
分享到:
相关推荐
标题中的"symetric-key.rar_Symmetric-Key_encryption"暗示了我们正在讨论的是对称密钥加密技术,这是一种广泛用于数据加密的方法。对称密钥加密是加密技术的基础,它的核心特点是加密和解密使用相同的密钥。这种...
DES.java generates the symmetric key using DES algorithm. Key size assigned here is 64 bits. It works only for the key size of 64 bits. 56 bits is mentioned in the coding remaining 8bits is accessed ...
Chapters one through five cover the architecture of the JCE and JCA, symmetric and asymmetric key encryption in Java, message authentication codes, and how to create Java implementations with the API...
1. Symmetric Encryption(对称加密):对称加密使用相同的密钥进行加密和解密,如AES(高级加密标准)、DES(数据加密标准)和Triple DES。对称加密速度快,适用于大量数据的加密,但密钥管理和分发较复杂。 2. ...
Simulates nonlinear effect in optical fiber called Cross Phase Modulation for symmetric regim using matlab
This library exposes security functionality to the programmer, such as random number generation, hashing, salted hashing, message authentication code, symmetric encryption, asymmetric encryption, ...
ope算法实现过程和实例
java java_leetcode-101-symmetric-tree
ASP.NET提供了多种加密方法,如Symmetric Encryption(对称加密)、Asymmetric Encryption(非对称加密)和Hashing(哈希)。 1. 对称加密:在这种加密模式中,加密和解密使用相同的密钥。ASP.NET中常用的对称加密...
动态可搜索对称加密(Dynamic Searchable Symmetric Encryption, DSSE)是一种允许用户对密文执行搜索操作,并能够根据要求(例如添加或删除某些密文)更新这些密文的加密技术。在云计算存储安全领域,DSSE被认为是...
对origin类中的内容进行encrypted ,然后将其写入encrypted类中,然后再decrypted到decrypted类中。... 您应该在Origin头下看到原始内容,在Encrypted头下看到加密内容,在Decrypted头下看到解密内容,并在控制台中...
java面试算法/刷题
标题中的“UDP穿越Symmetric NAT(对称型NAT)的端口猜测方法”涉及到的是互联网通信中的一个关键问题,即如何在对称型网络地址转换(Symmetric NAT)环境中实现用户数据报协议(UDP)的数据传输。Symmetric NAT是一种...
本题"Symmetric Number"来源于亚马逊中国的在线笔试,旨在考察应聘者的Java编程能力和问题解决技巧。对称数字是指一个数字,它的反转(从右向左读)仍然形成一个有效的数字,且与原数字相近。例如,123是131的对称...
Asymmetric Co-Teaching for Unsupervised Cross-Domain Person Re-Identification Asymmetric Co-Teaching for Unsupervised Cross-Domain Person Re-Identification 是一种旨在解决跨域人体重识别问题的方法。...
升级到SymmetricEncryption V4 对称加密的第4版在大多数要传递多个参数或以前使用哈希的API上完全采用了Ruby关键字参数。 加密和解密API现在需要任何可选参数的关键字参数。 下列情况不发生变化: encrypted = Sy
3. **对称加密(Symmetric Key Encryption)** - **AES加密**:使用相同的密钥进行加密和解密,如`javax.crypto.Cipher`类中的`Cipher.getInstance("AES/ECB/PKCS5Padding")`。以下是一个简单的AES加密示例: ```...
【Java笔试题解析】 在2020年兴业银行的Java笔试中,涉及了多个核心的Java编程和技术概念。以下是对部分题目进行的详细解答: 1. 输入一个正整数,计算并输出距离它最近的对称数 对称数是指从左向右读和从右向左...
1. **Symmetric Encryption(对称加密)**:对称加密是最常见的加密方式,因为它速度快、效率高。C#中常用的对称加密算法有AES(高级加密标准)、DES(数据加密标准)和TripleDES。例如,可以使用Aes类进行加密: `...