java和erlang之间的DES加解密
app登录,登录的密码要用DES加密,服务器是用erlang,客户端要同时支持多平台(Android、iOS)。首先,Java端的DES加密的实现方式,
少说废话了,直接上代码,如下:
public class DES {
private static byte[] iv = { 1, 2, 3, 4, 5, 6, 7, 8 }; public static String encryptDES(String encryptString, String encryptKey)
throws Exception {
IvParameterSpec zeroIv = new IvParameterSpec(iv);
SecretKeySpec key = new SecretKeySpec(encryptKey.getBytes(), "DES");
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
byte[] encryptedData = cipher.doFinal(encryptString.getBytes());
return Base64.encode(encryptedData);
}
}
上述代码用到了一个Base64的编码类,其代码的实现方式如下:
public class Base64 {
private static final char[] legalChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
.toCharArray(); /**
* data[]进行编码
*
* @param data
* @return
*/
public static String encode(byte[] data) {
int start = 0;
int len = data.length;
StringBuffer buf = new StringBuffer(data.length * 3 / 2); int end = len - 3;
int i = start;
int n = 0; while (i <= end) {
int d = ((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 0x0ff) << 8)
| (((int) data[i + 2]) & 0x0ff); buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append(legalChars[(d >> 6) & 63]);
buf.append(legalChars[d & 63]); i += 3; if (n++ >= 14) {
n = 0;
buf.append(" ");
}
} if (i == start + len - 2) {
int d = ((((int) data[i]) & 0x0ff) << 16)
| ((((int) data[i + 1]) & 255) << 8); buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append(legalChars[(d >> 6) & 63]);
buf.append("=");
} else if (i == start + len - 1) {
int d = (((int) data[i]) & 0x0ff) << 16; buf.append(legalChars[(d >> 18) & 63]);
buf.append(legalChars[(d >> 12) & 63]);
buf.append("==");
} return buf.toString();
}
}
注意下:这里用的des加密,cbc模式,填充方式是:PKCS5Padding,还需注意下key和Ivev
然后,服务器由erlang解密,注意上述的加密模式,填充方式,以及key和Ivev的值需要保持一样。
代码如下:
-module(des). -define(DES_KEY, des_key).
-define(CHARSET, charset). -export([encrypto_des_cbc/1,decrypto_des_cbc/1,
encrypto_des_cbc/3,decrypto_des_cbc/3]). encrypto_des_cbc(PlainText) ->
Key = "xxxxxxxx",
Charset = utf8,
encrypto_des_cbc(PlainText, Key, Charset). decrypto_des_cbc(Ciphertext) ->
Key = "xxxxxxxx",
Charset = utf8,
decrypto_des_cbc(Ciphertext, Key, Charset). %% des 加密
encrypto_des_cbc(PlainText, Key, Charset) ->
Key2 = unicode:characters_to_list(Key, Charset),
Ivec = <<1,2,3,4,5,6,7,8>>, %% 按DES规则,补位
N = 8 - (byte_size(list_to_binary(PlainText)) rem 8),
PlainText2 = lists:append(PlainText, get_padding(N)),
%% 加密
Ciphertext = crypto:block_encrypt(des_cbc, Key2, Ivec, PlainText2),
{ok, Ciphertext}. %% des 解密
decrypto_des_cbc(Ciphertext, Key, Charset) -> Key2 = unicode:characters_to_list(Key, Charset),
Ivec = <<1,2,3,4,5,6,7,8>>,
case is_list(Ciphertext) of
true ->
CipherBin = list_to_binary(Ciphertext);
false ->
CipherBin = Ciphertext
end, PlainAndPadding = crypto:block_decrypt(des_cbc,Key2,Ivec,CipherBin),
<<PosLen/integer>> = binary_part(PlainAndPadding,{size(PlainAndPadding),-1}),
Len = byte_size(PlainAndPadding) - PosLen,
<<PlainText:Len/binary, _:PosLen/binary>> = PlainAndPadding,
{ok, PlainText}. get_padding(N) ->
case N of
0 ->
get_padding2(8,8,[]);
Num ->
get_padding2(Num,Num,[])
end. get_padding2(N, Val, PaddingList) when N > 0 ->
get_padding2(N-1, Val, [Val] ++ PaddingList);
get_padding2(N, _Val,PaddingList) when N == 0 ->
PaddingList.
这样,server端就可以解密了.
注意:java的des加密的最后有个base64的转码,server的解密,首先需要base64:decode,然后再是des的解密 decode.
这里可扩展AES加解密和对应模式等等.
这个的加解密的执行的shell截图没有上传,小伙伴可以试下~
java和erlang之间的DES加解密的更多相关文章
- Java拓展教程:文件DES加解密
Java拓展教程:文件加解密 Java中的加密解密技术 加密技术根据一般可以分为对称加密技术和非对称加密技术.对称加密技术属于传统的加密技术,它的加密和解密的密钥是相同的,它的优点是:运算速度快,加密 ...
- java与IOS之间的RSA加解密
很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...
- 一个java的DES加解密类转换成C#
原文:一个java的DES加解密类转换成C# 一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //i ...
- Java Des加解密方法(c#加密Java解密)
最近我们用Java把一个用.net编写的老系统重新做了翻版,但是登录还是用.net的登录.这样就会遇到一个比较棘手的问题,我们登录用的cookie信息都是.net用des加密的,但我们不得不用Java ...
- DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项
DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...
- Node.js的DES加解密和MD5加密
最基本的就是经常用的md5加密算法 代码如下 var MD5=function (data) { var _encrymd5 = require('crypto').createHas ...
- DES加解密算法Qt实现
算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...
- JavaScript与C#互通的DES加解密算法
原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DE ...
- PHP 基础篇 - PHP 中 DES 加解密详解
一.简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对 ...
随机推荐
- 【传输文件】文件传输协议FTP、SFTP和SCP
网络通信协议分层 应用层: HTTP(Hypertext Transfer Protocol 超文本传输协议,显示网页) DNS(Domain Name System) FTP(File Transf ...
- Understand:高效代码静态分析神器详解(一)【转】
转自:http://www.codemx.cn/2016/04/30/Understand01/ 之前用Windows系统,一直用source insight查看代码非常方便,但是年前换到mac下面, ...
- LeetCode OJ-- Distinct Subsequences ** 递推
https://oj.leetcode.com/problems/distinct-subsequences/ 对于string S 和 T求,T 是 S的几种子串. 首先想到了递归方法,列出递归公式 ...
- Python Challenge 第九关
第九关只有一幅图,上面有一些黑点.网页名字叫:connect the dots.可能是要把这些点连起来. 查看源代码,果然有两个整数集合 first 和 second.并且有个提示:first+sec ...
- 网站安全测试工具GoLismero
网站安全测试工具GoLismero GoLismero是一款开源的安全测试框架.目前,它的测试目标主要为网站.该框架采用插件模式,实现用户所需要的功能.GoLismero默认自带了导入.侦测.扫描.攻 ...
- spring配置文件中配置sessionFactory失败
配置失败主要原因有两个: <bean id="studentDaoImp" class="com.gxwuz.maven.dao.StudentDaoImp&quo ...
- BZOJ 4543 2016北京集训测试赛(二)Problem B: thr
Solution 这题的解法很妙啊... 考虑这三个点可能的形态: 令它们的重心为距离到这三个点都相同的节点, 则其中两个点分别在重心的两棵子树中, 且到重心的距离相等; 第三个点可能在重心的一棵不同 ...
- 安全搜索引擎Shodan(搜蛋)命令行模式使用TIPS
https://www.shodan.io/ 与谷歌通过网址来搜索互联网的方式不同,Shodan通过互联网背后的通道来搜索信息.它就象是一种“黑暗”的谷歌,不断在寻找服务器.网络摄像头.打印机.路由器 ...
- 命令提示符中运行SQL Server 2005
使用 sqlcmd 实用工具,可以在命令提示符处.SQLCMD 模式下的查询编辑器.Windows 脚本文件或 SQL Server 代理作业的操作系统 (Cmd.exe) 作业步骤中,输入 Tr ...
- C语言实现的水仙花数
#include <stdio.h>void main(){ int ge,shi,bai; for (int i =100; i < 1000; i++) { ...