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),超过位数密钥被忽略.所谓对 ...
随机推荐
- Linux(ubuntu)下手动安装 firefox 6 并且添加快捷方式图标
Mozilla 正式发布了Firefox 6,如果你的电脑上还在用非常古老的版本么,赶紧过来更新下吧,由于官网上面只是提供了linux下的.bz2的压缩包,没有deb或者rmp格式,所以需要自己安装下 ...
- [MySQL] lock知识梳理
MySQL Lock机制 INDEX: MySQL事务隔离级别 MVCC MySQL Lock类型 MySQL MDL CONTENT: 1. MySQL事务隔离级别 Read Uncommit RU ...
- 多线程设计模式 : Master-Worker模式
Master-Worker是常用的并行计算模式.它的核心思想是系统由两类进程协作工作:Master进程和Worker进程.Master负责接收和分配任务,Worker负责处理子任务.当各个Worker ...
- mariadb 集群使用
集群启动问题 在kvm虚机下,启动mariad,日志报如下错误: :: [Note] /usr/libexec/mysqld: Shutdown complete :: mysqld_safe mys ...
- hdu 4985(模拟)
Little Pony and Permutation Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Codeforces Gym101063 F.Bandejao (2016 USP-ICMC)
F.Bandejao It is lunch time on Mars! Everyone has got that big smile on their faces, all eager to se ...
- Vscode 小白使用介绍
前言 现在使用Vscode编码的人越来越多,凭借着免费,开源,轻量,跨平台的特点收货了一大批忠实粉丝 最近因项目需要开始使用Vscode,但不知为何,感觉有点力不从心,不知道该怎么用 首先想到去官 ...
- PHP如何在页面中原样输出HTML代码
字符串与HTML之间的相互转换主要应用htmlentities()函数来完成. header("Content-Type: text/html; charset=utf-8"); ...
- VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图)
VS2010 MFC中制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) 1. 在资源窗口里新建一个FormView的Dialog,修改ID为 ...
- OSG(OpenSceneGraphic) 渲染引擎架构--整体认识 [转]
原文:http://blog.csdn.net/zangle260/article/details/41123067?utm_source=tuicool 本文参考<<osg最长一帧> ...