加密算法有很多,我在网上找了个简单的算法,可惜是C语言的, 朕很不满意 ,一怒之下,自己研究了研究,改造成了java的;
后来ios端也需要解密后台加密的数据,所以,又把算法简化了一下,作成了java和OC通用的加密算法。现在分享给大家。希望对大家有所帮助
java的加密小demo
public class MainTest {
public static void main(String[] args) {
String text="8952262wsdf wef vew 885";//需要加密的字符串
int key=1314;//key
String jiami=Encrypt(text,key);//加密
System.out.println("密文:"+jiami);
String jiemi=Decrypt(jiami,key);//解密
System.out.println("原文文:"+jiemi);
}
private static int C1= 52845;
private static int C2= 22719;
// 加密函数
public static String Encrypt(String S, int Key)
{
StringBuffer Result=new StringBuffer();
StringBuffer str;
int i,j;
for(i=0; i<S.length(); i++){
// 依次对字符串中各字符进行操作
Result.append((char)(S.charAt(i)^(Key>>8))); // 将密钥移位后与字符异或
Key = ((byte)Result.charAt(i)+Key)*C1+C2; // 产生下一个密钥
}
S=Result.toString();
System.out.println("密文中间值:"+S);
Result=new StringBuffer();
for(i=0; i<S.length(); i++) // 对加密结果进行转换
{
j=(int)S.charAt(i); // 提取字符
// 将字符转换为两个字母保存
str=new StringBuffer(); // 设置str长度为2
str.append((char)(65+j/26));//这里将65改大点的数例如256,密文就会变乱码,效果更好,相应的,解密处要改为相同的数
str.append((char)(65+j%26));
Result.append(str);
}
return Result.toString();
}
// 解密函数
public static String Decrypt(String S, int Key)
{
StringBuffer Result=new StringBuffer();
StringBuffer str;
int i,j;
for(i=0; i < S.length()/2; i++) // 将字符串两个字母一组进行处理
{
j = ((int)S.charAt(2*i)-65)*26;//相应的,解密处要改为相同的数
j += (int)S.charAt(2*i+1)-65;
Result.append((char)j);
}
S=Result.toString(); // 保存中间结果
System.out.println("原文中间值:"+S);
Result=new StringBuffer();
for(i=0; i<S.length(); i++) // 依次对字符串中各字符进行操作
{
Result.append((char)(S.charAt(i)^(Key>>8))); // 将密钥移位后与字符异或
Key = ((byte)S.charAt(i)+Key)*C1+C2; // 产生下一个密钥
}
return Result.toString();
}
}
原来的C/C++的加密demo
基于vc6 :
// 常量
#define C1 52845
#define C2 22719
CString Encrypt(CString S, WORD Key) // 加密函数
{
CString Result,str;
int i,j;
Result=S; // 初始化结果字符串
for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, S.GetAt(i)^(Key>>8)); // 将密钥移位后与字符异或
Key = ((BYTE)Result.GetAt(i)+Key)*C1+C2; // 产生下一个密钥
}
S=Result; // 保存结果
Result.Empty(); // 清除结果
for(i=0; i<S.GetLength(); i++) // 对加密结果进行转换
{
j=(BYTE)S.GetAt(i); // 提取字符
// 将字符转换为两个字母保存
str="12"; // 设置str长度为2
str.SetAt(0, 65+j/26);//这里将65改大点的数例如256,密文就会变乱码,效果更好,相应的,解密处要改为相同的数
str.SetAt(1, 65+j%26);
Result += str;
}
return Result;
}
// 解密函数
CString Decrypt(CString S, WORD Key)
{
CString Result,str;
int i,j;
Result.Empty(); // 清除结果
for(i=0; i < S.GetLength()/2; i++) // 将字符串两个字母一组进行处理
{
j = ((BYTE)S.GetAt(2*i)-65)*26;//相应的,解密处要改为相同的数
j += (BYTE)S.GetAt(2*i+1)-65;
str="1"; // 设置str长度为1
str.SetAt(0, j);
Result+=str; // 追加字符,还原字符串
}
S=Result; // 保存中间结果
for(i=0; i<S.GetLength(); i++) // 依次对字符串中各字符进行操作
{
Result.SetAt(i, (BYTE)S.GetAt(i)^(Key>>8)); // 将密钥移位后与字符异或
Key = ((BYTE)S.GetAt(i)+Key)*C1+C2; // 产生下一个密钥
}
return Result;
}
//实际应用
xxx()
{
CString text=_T("abc_@#%#$^$^ $");//需要加密的字符串
WORD key=1314;//key
CString jiami=Encrypt(text,key);//加密
AfxMessageBox(_T("密文:")+jiami);
CString jiemi=Decrypt(jiami,key);//解密
AfxMessageBox(_T("原文:")+jiemi);
}
简化后的java与oc通用的加密算法
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import java.nio.ByteBuffer;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import org.bouncycastle.math.ec.ECPoint;
import org.junit.Test;
public class test {
private int C1 = 520;
private int C2 = 1314;
@Test
public void test() {
String text="zhangys";//需要加密的字符串
System.out.println("原文:"+text);
int key=20171001;//key
String jiami=Encrypt(text,key);//加密
System.out.println("密文:"+jiami);
String jiemi=Decrypt(jiami,key);//解密
System.out.println("原文文:"+jiemi);
}
/**
* 加密函数
*/
public String Encrypt(String S, int Key) {
ByteBuffer buffer=ByteBuffer.allocate(S.length()*2);
for (int i = 0; i < S.length(); i++) {
// 依次对字符串中各字符进行操作
char c=(char)((S.charAt(i)) ^ (Key >> 8));
System.out.println(i+"c: "+(int)c);
byte[] b=charToByte(c);
buffer.put(b);
Key = (Key>>8) * C1 + C2; // 产生下一个密钥
}
// System.out.println(buffer.);
buffer.flip();
// 构建一个byte数组
byte[] content = new byte[buffer.limit()];
// 从ByteBuffer中读取数据到byte数组中
buffer.get(content);
// 把byte数组的内容写到标准输出
System.out.println(bytesToHexString(content));
return new String(Base64.getEncoder().encodeToString(content));
}
/**
* 解密函数
*/
public String Decrypt(String S, int Key) {
StringBuffer Result = new StringBuffer();
byte[] content;
try {
content=Base64.getDecoder().decode(S.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "";
}
System.out.println("content: "+bytesToHexString(content));
for (int i = 0; i < content.length/2; i++) // 依次对字符串中各字符进行操作
{
byte [] b={content[i*2],content[i*2+1]};
char c=byteToChar(b);
System.out.println(i+"c: "+(int)c);
Result.append((char)( c ^ (Key >> 8))); // 将密钥移位后与字符异或
Key = (Key>>8) * C1 + C2; // 产生下一个密钥;
}
return Result.toString();
}
//char转化为byte:
public byte[] charToByte(char c) {
byte[] b = new byte[2];
b[0] = (byte) ((c & 0xFF00)>> 8);
b[1] = (byte) (c & 0xFF);
return b;
}
//byte转换为char:
public char byteToChar(byte[] b) {
char c = (char) (((b[0] & 0xFF)<< 8) | (b[1] &0xFF));
return c;
}
public String bytesToHexString(byte[] data, int start, int end) {
StringBuilder sb = new StringBuilder("");
if(data == null) {
return "";
} else {
end = Math.min(end, data.length);
for(int index = start; index < end; ++index) {
int v = data[index] & 255;
String hv = Integer.toHexString(v);
if(hv.length() < 2) {
sb.append(0);
}
sb.append(hv.toLowerCase());
}
return sb.toString();
}
}
public String bytesToHexString(byte[] data) {
return data == null?"":bytesToHexString(data, 0, data.length);
}
}
日志输出:
原文:zhangys
0c: 13234
1c: 29019
2c: 62869
3c: 5106
4c: 30653
5c: 37646
6c: 29693
33b2715bf59513f277bd930e73fd
密文:M7JxW/WVE/J3vZMOc/0=
content: 33b2715bf59513f277bd930e73fd
0c: 13234
1c: 29019
2c: 62869
3c: 5106
4c: 30653
5c: 37646
6c: 29693
原文文:zhangys
oc ios端的加密解密
//
// SecretUtils.m
// SecondApp
//
// Created by localuser on 2017/10/10.
// Copyright © 2017年 localuser. All rights reserved.
#include <string.h>
#import "SecretUtils.h"
#define C1 520
#define C2 1314
@implementation SecretUtils
//加密函数
+(NSString *)Encrypt:( NSMutableString *)S withKey:(int)Key{
Byte byteEncrypt[[S length]*2];
for(int i=0; i<[S length]; i++) // 依次对字符串中各字符进行操作
{
unichar c=[S characterAtIndex:i]^(Key>>8);
// NSLog(@"c: %d",(int)c);
Byte b[2];
b[0]=(Byte)((c&0xFF00)>>8);
b[1]=(Byte)(c&0xFF);
//[self IntToBytes:c with:b];
byteEncrypt[i*2]=b[0];
byteEncrypt[i*2+1]=b[1];
// NSLog(@"%d b[0]:%d b[1]:%d",i,b[0],b[1]);
Key = (Key>>8)*C1+C2; // 产生下一个密钥
}
NSData *plainData = [NSData dataWithBytes:byteEncrypt length:sizeof(byteEncrypt)/sizeof(char)];
NSString *base64String = [plainData base64EncodedStringWithOptions:0];
return base64String;
}
//解密函数
+(NSString *)Decrypt:(NSString *)S withKey:(int)Key{
NSMutableString *Result=[[NSMutableString alloc]init];
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:S options:0];
//Byte *content=(Byte *)[decodedData bytes];
//int length= strlen(content)/2;
NSUInteger len = [decodedData length];
Byte *content = (Byte*)malloc(len);
memcpy(content, [decodedData bytes], len);
int length= len/2;
for(int i=0; i<length; i++) // 依次对字符串中各字符进行操作
{
Byte b[2]={content[2*i],content[2*i+1]};
unichar c= (unichar)(((b[0]& 0xff)<<8)| (b[1]&0xff));
// NSLog(@"jiemi c: %d",c);
// NSLog(@"%d b[0]: %d b[1]:%d",i,content[2*i],content[2*i+1]);
[Result appendString:[NSString stringWithFormat:@"%c", c^(Key>>8)]];
Key = (Key>>8)*C1+C2;
}
return Result;
}
@end
//test
int key=20171001;
NSString * s=[SecretUtils Encrypt:@"zhangys" withKey:key];
NSLog(@"密文为: %@",s);
NSString * s1=[SecretUtils Decrypt:s withKey:key];
NSLog(@"明文为: %@",s1);
主要日志
2017-10-12 15:56:11. 密文为: M7JxW/WVE/J3vZMOc/0=
2017-10-12 15:56:11. 明文为: zhangys
这里java和oc的密文加密结果一致。而且都能单独加密和解密,相互加密和解密。总算是没白忙活。