1. 程式人生 > >一個簡單的加密演算法(通用於java和OC的簡單加密演算法)

一個簡單的加密演算法(通用於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的密文加密結果一致。而且都能單獨加密和解密,相互加密和解密。總算是沒白忙活。

相關推薦

一個簡單加密演算法用於javaOC簡單加密演算法

加密演算法有很多,我在網上找了個簡單的演算法,可惜是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練習:蓄水池問題 內附JavaPython的實現方法

      刷了道練習題目,關於蓄水池的問題,這裡我分別用Python和Java實現一下。 題目: Given n non-negative integers a1, a2, ..., an , w

資料傳輸加密——非對稱加密演算法RSA+對稱演算法AES(適用於java,androidWeb)

本篇文章已授權微信公眾號 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.javaList<?>

添加 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加密算法實現JavaC#相互加密解密

.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的最短路徑。從動態規劃的