一個簡單的加密演算法(通用於java和OC的簡單加密演算法)
加密演算法有很多,我在網上找了個簡單的演算法,可惜是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("[email protected]#%#$^$^ $");//需要加密的字串
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的密文加密結果一致。而且都能單獨加密和解密,相互加密和解密。總算是沒白忙活。
相關推薦
一個簡單的加密演算法(通用於java和OC的簡單加密演算法)
加密演算法有很多,我在網上找了個簡單的演算法,可惜是C語言的, 朕很不滿意 ,一怒之下,自己研究了研究,改造成了java的; 後來ios端也需要解密後臺加密的資料,所以,又把演算法簡化了一下,作成了java和OC通用的加密演算法。現在分享給大家。希望對大家
QT 貪吃蛇簡單程式碼實現(原創用於理解原理,請勿隨意傳播)
main.cpp #include "mainwindow.h" #include <QApplication> int main(int argc, char *argv[]) { QApplication a(argc, argv); M
中獎概率演算法(可用於刮刮樂、轉盤抽獎)
說明 使用簡單的用法 ,高效的概率演算法實現抽獎邏輯 使用php語法,laravel框架總結 示例程式碼 <?php /** * 抽獎類 */ class AwardController { /** * 中獎邏輯實現
LeetCode練習:蓄水池問題 (內附Java和Python的實現方法)
刷了道練習題目,關於蓄水池的問題,這裡我分別用Python和Java實現一下。 題目: Given n non-negative integers a1, a2, ..., an , w
資料傳輸加密——非對稱加密演算法RSA+對稱演算法AES(適用於java,android和Web)
本篇文章已授權微信公眾號 guolin_blog (郭霖)獨家釋出 資料傳輸加密 在開發應用過程中,客戶端與服務端經常需要進行資料傳輸,涉及到重要隱私資訊時,開發者自然會想到對其進行加密,即使傳輸過程中被“有心人”擷取,也不會將資訊洩露。對於加密
滑動視窗法演算法(matlab、java)
這是第一次寫博文,想加強自己對於這方面知識點的理解,雖然演算法很簡單,但是想把自己想法寫下來。 正好看到《劍指offer題目》面試題65:滑動視窗的最大值 給定⼀一個數組和滑動視窗的大⼩,找出所有滑動視窗⾥裡里數值的最⼤大值。例如,如果輸入陣列{2,3,4,2,6,2,5
排序演算法(氣泡排序,插入排序,選擇排序)的Java實現
// 氣泡排序 public int[] bubble(int[] a) { for (int i = 0; i < a.length-1; i++) { // 相鄰的兩個數做比較,小的想上冒泡,-1防止陣列下標越界 for (int j
AWS SDK for Java 的使用(適用於 Java 的 AWS 開發工具包開發人員指南)之配置aws憑證
今天接了個新專案,使用的AWS SDK for Java。例如: <dependency> <groupId>com.amazonaws</groupId> <artifactId>
【C#公共幫助類】給大家分享一些加密演算法 (DES、HashCode、RSA、AES等)
AES 高階加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府採用的一種區塊加密標準。這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。AES先進加密演算法是一向被認為牢不可破的加密演算法,
c++實現一個打分演算法(去掉最低分和最高分求平均值)
#include<iostream> using namespace std; const int StuNum = 10; double countavergescore(double * arr, int n); int main() { double arr[StuNum]; cout &l
PHP實現一個簡單的計算器(在html頁面和php檔案之間傳值)
先一個小案例簡單說明一下,從html頁面提交的資料如何傳給另一個php檔案。 先是一個簡單的html頁面: <html> <body> <form action="test1.php" method="post">
Aes加密(Android與Java後臺可以正常加解密 )
本文采用的加密模式是AES-128-CBC,這種加密模式可以自己定義“金鑰”和“偏移量“。 程式碼如下,Android端及Java後臺都可以直接使用 import javax.crypto.Cipher; import javax.crypto.spec.I
走入計算機的第四天(linux的熱鍵和一些簡單的命令)
簡單介紹 所有 環境 信息 名稱 命令 -- log stdin 1linux的簡單介紹 linux是一款免費使用和自由傳播的內似於unix的操作系統軟件,是一個基於POSI和unix的多用戶,多任務,支持多線程和多CPU的一種操作系統。主要用於服務器,特別是網絡服務器
SSM框架下分頁的實現(封裝page.java和List<?>)
添加 interface jsp頁面 har show 初始化 ring array dex 之前寫過一篇博客 java分頁的實現(後臺工具類和前臺jsp頁面),介紹了分頁的原理。 今天整合了Spring和SpringMVC和MyBatis,做了增刪改查和分頁,之前的邏輯
Fidder簡單使用方法(HTTPS抓取和url替換)
session art 連接 nbsp rules 添加 代理 detail 接下來 Fidder是一個windows端主流的抓包工具,可以配置代理,抓https的數據,還可以修改請求體和內容下面是一些簡單的使用方法 安裝完畢後Tools
SM4加密算法實現Java和C#相互加密解密
.net ++ println ffffff 預處理 AS 思路 load prop SM4加密算法實現Java和C#相互加密解密 近期由於項目需要使用SM4對數據進行加密,然後傳給Java後臺,Java後臺使用的也是SM4的加密算法但是就是解密不正確,經過一步步調
JS高級----------------->原型簡單的寫法(註意手動修改構造器的指向)
需要 htm -c 手動 idt 註意 log fun clas <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <titl
MyBatis 使用簡單的 XML或註解用於配置和原始映射
代碼 aps 框架 改名 基於 接口 code pla war MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,並且改名為MyBatis 。MyBatis
訊息摘要演算法(慕課網視訊總結與知識梳理)
訊息摘要演算法分類: MD(Message Digetst):訊息摘要 SHA(Secure Hash Algorithm):安全雜湊 MAC(Message Authentication Code):訊息認證碼 以上演算法主要是用來驗證資料的完
Flody演算法(有權多源最短路徑問題)
多源最短路徑問題,即為求每一對頂點之間的最短路徑問題 演算法描述 演算法思想原理: Floyd演算法是一個經典的動態規劃演算法。用通俗的語言來描述的話,首先我們的目標是尋找從點i到點j的最短路徑。從動態規劃的