一个简单的加密算法(通用于java和OC的简单加密算法)

5 篇文章 0 订阅
4 篇文章 0 订阅

加密算法有很多,我在网上找了个简单的算法,可惜是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的密文加密结果一致。而且都能单独加密和解密,相互加密和解密。总算是没白忙活。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值