精华内容
下载资源
问答
  • 用C语言实现的AES加密解密算法

    千次下载 热门讨论 2013-08-26 10:36:17
    用C语言实现的AES加密解密算法,用C语言实现的AES加密解密算法
  • 【加密】DES加密解密算法

    千次阅读 热门讨论 2017-04-15 16:06:12
    近几天,小编在项目中遇到了加密解密的这些技术,以前也接触过MD5加密解密算法。我说用MD5做得了,同组开发的崔哥说MD5不可逆,研究一下其他的加密解密的算法。然后就在网上找了DES的算法。 二、什么是DES? DES...

    一、前言

          近几天,小编在项目中遇到了加密解密的这些技术,以前也接触过MD5加密解密算法。我说用MD5做得了,同组开发的崔哥说MD5不可逆,研究一下其他的加密解密的算法。然后就在网上找了DES的算法。

    二、什么是DES?

          DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。

    三、封装的DES算法类

          关于DES算法,他有一个核心的算法key,不同的key值可以得到不同的结果。所以小编把这个key值分析了一下,提取出来可以由用户自行设置。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Security.Cryptography;
    using System.IO;
    
    namespace DESDecder
    {
        /// <summary>  
        /// DES加密解密算法  
        /// </summary>  
        public  class DES
        {
            /// <summary>  
            /// DES加密算法  
            /// sKey为8位或16位  
            /// </summary>  
            /// <param name="pToEncrypt">需要加密的字符串</param>  
            /// <param name="sKey">密钥</param>  
            /// <returns></returns>  
            public string DesEncrypt(string pToEncrypt, string sKey)
            {
                StringBuilder ret = new StringBuilder();
    
                try
                {
                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                    byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
                    MemoryStream ms = new MemoryStream();
                    CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
    
                    foreach (byte b in ms.ToArray())
                    {
                        ret.AppendFormat("{0:X2}", b);
                    }
                    ret.ToString();
                }
                catch
                {
    
                }
                return ret.ToString();
                //return a;  
            }
            /// <summary>  
            /// DES解密算法  
            /// sKey为8位或16位  
            /// </summary>  
            /// <param name="pToDecrypt">需要解密的字符串</param>  
            /// <param name="sKey">密钥</param>  
            /// <returns></returns>  
            public string DesDecrypt(string pToDecrypt, string sKey)
            {
                MemoryStream ms = new MemoryStream();
    
                try
                {
                    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                    byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
                    for (int x = 0; x < pToDecrypt.Length / 2; x++)
                    {
                        int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
                        inputByteArray[x] = (byte)i;
                    }
                    des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
                    des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
    
                    CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
                    cs.Write(inputByteArray, 0, inputByteArray.Length);
                    cs.FlushFinalBlock();
                    StringBuilder ret = new StringBuilder();
    
                }
                catch
                {
    
                }
    
                return System.Text.Encoding.Default.GetString(ms.ToArray());
            }
    
    
            #region 加密解密
    
            public static DES dd = new DES();
    
            public static string StringKey = "A123456."; // 加密密钥  
    
            /// <summary>  
            /// 解密  
            /// </summary>  
            /// <param name="str"></param>  
            /// <returns></returns>  
            public static string StringDecder(string str)
            {
                return dd.DesDecrypt(str, StringKey);
            }
    
            /// <summary>  
            /// 加密  
            /// </summary>  
            /// <param name="str"></param>  
            /// <returns></returns>  
            public static string StringEncoder(string str)
            {
                return dd.DesEncrypt(str, StringKey);
            }
    
            #endregion   
        }  
    }
    

    四、小结

          通过学习这个算法,算是对这个有了一定的了解了。在以后的算法学习过程中,只要有现成的例子就可以更加深入的学习,可以对比学习了。

    展开全文
  • 国密SM9算法C++实现之六:加密解密算法 国密SM9算法C++实现之六:加密解密算法 加密算法流程 加密结果值 Cipher.h 加密算法实现 解密算法流程 解密算法实现 加密算法...

    SM9算法C++实现系列目录:

    国密SM9算法C++实现之七:加密解密算法

    加密算法流程

    SM9标准文档中描述的加密算法流程如下所示:
    这里写图片描述

    其流程图为:
    这里写图片描述

    根据算法描述,定义接口函数:

    	/**
    	* 加密
    	*
    	* @param masterPublicKey 加密主公钥
    	* @param id 用户ID
    	* @param data 待加密数据
    	* @param isBaseBlockCipher 指明加密明文的方法:true-分组密码;false-基于KDF的序列密码
    	* @param macKeyLen MAC函数的密钥字节长度,应不少于MAC函数中杂凑函数的杂凑值长度。此处可设置32字节
    	* @return 加密值
    	* @throw std::exception SM9_ERROR_NOT_INIT | SM9_ERROR_CALC_RATE
    	*/
    	static Cipher encrypt(const string& masterPublicKey, const string& id, const string& data, bool isBaseBlockCipher, int macKeyLen);
    

    对于加密和解密算法中的明文加密方法,这里定义isBaseBlockCipher 参数来指示;同时,加解密算法中有两个长度,一个是用分组密码加密时的K1_len,因为使用的是SM4,所以是固定的16字节;另一个是K2_len,这个是MAC函数的密钥长度。按照MAC函数定义来说,这个长度是可以变的,但最好不小于MAC函数中的哈希函数的哈希值长度,这里因为使用的是SM3,所以默认是32字节。此处提供一个macKeyLen参数表示此K2_len长度,可以根据需要去掉该参数。

    加密结果值

    SM9加密结果内部包括C1、C2和C3三个部分,对此,也简单将其封装为一个类。这个封装是可取的,可以方便解密时的数据提取。

    Cipher.h

    
    #ifndef YY_SM9_CIPHER_INCLUDE_H__
    #define YY_SM9_CIPHER_INCLUDE_H__
    
    #pragma once
    
    #include <string>
    using namespace std;
    
    /**
    * 加密值,封装了加密结果,包括C1、C2、C3.
    * @author YaoYuan
    */
    class Cipher {
    public:
    	Cipher() {}
    
    	Cipher(const string& C1, const string& C2, const string& C3) {
    		mC1 = C1;
    		mC2 = C2;
    		mC3 = C3;
    	}
    
    	~Cipher() {}
    
    public:
    	string getC1() const { return mC1; }
    	string getC2() const { return mC2; }
    	string getC3() const { return mC3; }
    
    	/**
    	* 加密数据结构构造函数.
    	* @param cipherData 加密数据,可由{@link #toByteArray()}获得
    	*/
    	static Cipher fromByteArray(const string& cipherData) {
    		string C1 = string(cipherData, 0, 64);
    		string C3 = string(cipherData, 64, 32);
    		string C2 = string(cipherData, 64 + 32, cipherData.length() - 96);
    		return Cipher(C1, C2, C3);
    	}
    
    	string toByteArray() {
    		return mC1 + mC3 + mC2;
    	}
    
    private:
    	string mC1;
    	string mC2;
    	string mC3;
    
    };
    
    
    #endif
    

    加密算法实现

    按照加密流程,实现加密算法:

    Cipher SM9::encrypt(const string& masterPublicKey, const string& id, const string& data, bool isBaseBlockCipher, int macKeyLen)
    {
    	Cipher cipher;
    	bool hasException = true;
    	big h1 = NULL;
    	big r = NULL;
    	epoint *Ppube = NULL;
    	epoint *QB = NULL;
    	epoint *C1 = NULL;
    	ZZN12 g;
    	ZZN12 w;
    	string sC1, sC2, sC3, sW, bufferZ, sK, sK1, sK2, tmp, hashH1;
    	int klen = 0;
    	int k1len = 16; // key length for sm4
    	int k2len = macKeyLen;
    
    #ifdef SELF_CHECK
    	string hashH1Hex, QBHex, rHex, C1Hex, C2Hex, C3Hex, gHex, wHex, K1Hex, K2Hex;
    #endif
    
    	if( !mIsInit ) {
    		mErrorNum = SM9_ERROR_NOT_INIT;
    		throw exception(getErrorMsg().c_str());
    	}
    
    	Parameters::init_big(h1);
    	Parameters::init_epoint(Ppube);
    	Parameters::init_epoint(QB);
    	Parameters::init_epoint(C1);
    	Parameters::init_big(r);
    
    	hashH1 = KGC::H1(id, HID_ENCRYPT);
    	Parameters::cin_big(h1, hashH1.c_str(), hashH1.length());
    	Parameters::cin_epoint(Ppube, masterPublicKey.c_str());
    
    #ifdef SELF_CHECK
    	hashH1Hex = YY::YHex::bin2Hex(hashH1);
    #endif
    
    	// Step1 : QB=[H1(IDB||hid, N)]P1+Ppub-e
    	ecurve_mult(h1, Parameters::param_P1, QB);
    	ecurve_add(Ppube, QB);
    	
    #ifdef SELF_CHECK
    	QBHex = YY::YHex::bin2hex(Parameters::cout_epoint(QB));
    #endif
    
    	while( true ) {
    #ifdef SELF_CHECK
    		rHex = YY::YHex::hex2bin("AAC0541779C8FC45E3E2CB25C12B5D2576B2129AE8BB5EE2CBE5EC9E785C");
    		Parameters::cin_big(r, rHex.c_str(), rHex.length());
    #else
    		// Step2: generate r
    		bigrand(Parameters::param_N, r);
    #endif
    
    		// Step3 : C1=[r]QB
    		ecurve_mult(r, QB, C1);
    		sC1 = Parameters::cout_epoint(C1);
    
    #ifdef SELF_CHECK
    		C1Hex = YY::YHex::bin2Hex(sC1);
    #endif
    
    		// Step4 : g=e(Ppub-e, P2)
    		if( !ZZN12::calcRatePairing(g, Parameters::param_P2, Ppube, Parameters::param_t, Parameters::norm_X) ) {
    			mErrorNum = SM9_ERROR_CALC_RATE;
    			goto END;
    		}
    
    #ifdef SELF_CHECK
    		gHex = YY::YHex::bin2Hex(g.toByteArray());
    #endif
    
    		// Step5 : calculate w=g^r
    		w = g.pow(r);
    		sW = w.toByteArray();
    
    #ifdef SELF_CHECK
    		wHex = YY::YHex::bin2Hex(sW);
    #endif
    
    		// Step6_1 : K = KDF(C1 || w || IDB, klen)
    		if( isBaseBlockCipher ) {
    			klen = k1len + k2len;
    		} else {
    			klen = data.length() + k2len;
    		}
    
    		bufferZ.append(sC1);
    		bufferZ.append(sW);
    		bufferZ.append(id);
    		sK = KGC::KDF(bufferZ, klen);
    
    		sK1 = string(sK, 0, sK.length()-k2len);
    		sK2 = string(sK, sK1.length(), sK.length()-sK1.length());
    
    #ifdef SELF_CHECK
    		K1Hex = YY::YHex::bin2Hex(sK1);
    		K2Hex = YY::YHex::bin2Hex(sK2);
    #endif
    
    		if( !isAllZero(sK1) )
    			break;
    	}
    	
    	// Step6_2
    	if( isBaseBlockCipher ) {
    		// C2=Enc(K1,M)
    		YY::YCipher sm4Cipher = YY::YCipher(YY::YCipher::SM4, YY::YCipher::ECB, YY::YCipher::PKCS5Padding);
    		sm4Cipher.init(YY::YCipher::ENCRYPT, sK1);
    		sC2 = sm4Cipher.update(data);
    		tmp = sm4Cipher.doFinal();
    		sC2.append(tmp);
    	} else {
    		// C2=M^K1
    		for( int i = 0; i < data.length(); i++ ) {
    			sC2.append(1, data[i] ^ sK1[i]);
    		}
    	}
    	
    	// Step7 : C3=MAC(K2,C2)
    	sC3 = MAC(sK2, sC2);
    
    #ifdef SELF_CHECK
    	C2Hex = YY::YHex::bin2Hex(sC2);
    	C3Hex = YY::YHex::bin2Hex(sC3);
    #endif
    
    	// Step8 : C=C1|C3|C2
    	cipher = Cipher(sC1, sC2, sC3);
    	hasException = false;
    
    END:
    	Parameters::release_big(h1);
    	Parameters::release_big(r);
    	Parameters::release_epoint(Ppube);
    	Parameters::release_epoint(QB);
    	Parameters::release_epoint(C1);
    
    	if( hasException ) {
    		throw exception(getErrorMsg().c_str());
    	}
    	return cipher;
    }
    

    解密算法流程

    SM9标准文档中描述的解密算法流程如下所示:
    这里写图片描述

    其流程为:
    这里写图片描述

    根据算法描述,定义接口函数:

    	/**
    	* 解密
    	*
    	* @param cipher 加密值
    	* @param prikey 用户私钥
    	* @param id 用户ID
    	* @param isBaseBlockCipher 指明加密明文的方法:true-分组密码;false-基于KDF的序列密码
    	* @param macKeyLen MAC函数的密钥字节长度,应不少于MAC函数中杂凑函数的杂凑值长度。此处可设置32字节
    	* @return 原始数据
    	* @throw std::exception SM9_ERROR_NOT_INIT | SM9_ERROR_CALC_RATE | 
    	* SM9_ERROR_DECRYPT_C1_NOT_ON_G1 | SM9_ERROR_DECRYPT_K1_IS_ZERO | SM9_ERROR_DECRYPT_C3_VERIFY_FAILED
    	*/
    	static string decrypt(const Cipher& cipher, const string& prikey, const string& id, bool isBaseBlockCipher, int macKeyLen);
    

    这里的后两个参数在使用时应该和加密时保持一致。

    解密算法实现

    
    std::string SM9::decrypt(const Cipher& cipher, const string& prikey, const string& id, bool isBaseBlockCipher, int macKeyLen)
    {
    	bool hasException = true;
    	string result, sC1, sC2, sC3, sK1, sK2, sK, sW, bufferZ, tmp, u, M;
    	epoint* C1 = NULL;
    	ecn2 de;
    	ZZN12 w;
    	YY::YSM3 sm3Digest;
    	int klen = 0;
    	int k1len = 16; // key length for sm4
    	int k2len = macKeyLen;
    
    #ifdef SELF_CHECK
    	string wHex, K1Hex, K2Hex, uHex, MHex;
    #endif
    
    	if( !mIsInit ) {
    		mErrorNum = SM9_ERROR_NOT_INIT;
    		throw exception(getErrorMsg().c_str());
    	}
    
    	sC1 = cipher.getC1();
    	sC2 = cipher.getC2();
    	sC3 = cipher.getC3();
    	Parameters::init_epoint(C1);
    	Parameters::init_ecn2(de);
    	
    	// Step1 : check if C1 is on G1
    	Parameters::cin_epoint(C1, sC1.c_str());
    	if( !Parameters::isPointOnG1(C1) ) {
    		mErrorNum = SM9_ERROR_DECRYPT_C1_NOT_ON_G1;
    		goto END;
    	}
    
    	// Step2 : w=e(c,de)
    	Parameters::cin_ecn2_byte128(de, prikey.c_str());
    	if( !ZZN12::calcRatePairing(w, de, C1, Parameters::param_t, Parameters::norm_X) ) {
    		mErrorNum = SM9_ERROR_CALC_RATE;
    		goto END;
    	}
    	sW = w.toByteArray();
    
    #ifdef SELF_CHECK
    	wHex = YY::YHex::bin2Hex(sW);
    #endif
    
    	// Step3_1 : K = KDF(C1 || w || IDB, klen)
    	if( isBaseBlockCipher ) {
    		klen = k1len + k2len;
    	} else {
    		klen = sC2.length() + k2len;
    	}
    
    	bufferZ.append(sC1);
    	bufferZ.append(sW);
    	bufferZ.append(id);
    	sK = KGC::KDF(bufferZ, klen);
    
    	sK1 = string(sK, 0, sK.length() - k2len);
    	sK2 = string(sK, sK1.length(), sK.length() - sK1.length());
    
    #ifdef SELF_CHECK
    	K1Hex = YY::YHex::bin2Hex(sK1);
    	K2Hex = YY::YHex::bin2Hex(sK2);
    #endif
    
    	if( isAllZero(sK1) ) {
    		mErrorNum = SM9_ERROR_DECRYPT_K1_IS_ZERO;
    		goto END;
    	}
    
    	// Step3_2
    	if( isBaseBlockCipher ) {
    		// M=Dec(K1,C2)
    		YY::YCipher sm4Cipher = YY::YCipher(YY::YCipher::SM4, YY::YCipher::ECB, YY::YCipher::PKCS5Padding);
    		sm4Cipher.init(YY::YCipher::DECRYPT, sK1);
    		M = sm4Cipher.update(sC2);
    		tmp = sm4Cipher.doFinal();
    		M.append(tmp);
    	} else {
    		// M=C2^K1
    		for( int i = 0; i < sC2.length(); i++ ) {
    			M.append(1, sC2[i] ^ sK1[i]);
    		}
    	}
    
    	// Step4 : u=MAC(K2,C2)
    	u = MAC(sK2, sC2);
    	if( u.compare(sC3) != 0 ) {
    		mErrorNum = SM9_ERROR_DECRYPT_C3_VERIFY_FAILED;
    		goto END;
    	}
    
    #ifdef SELF_CHECK
    	MHex = YY::YHex::bin2Hex(M);
    	uHex = YY::YHex::bin2Hex(u);
    #endif
    
    	// Step5
    	result = M;
    	hasException = false;
    
    END:
    	Parameters::release_epoint(C1);
    	Parameters::release_ecn2(de);
    
    	if( hasException ) {
    		throw exception(getErrorMsg().c_str());
    	}
    	return result;
    }
    
    
    展开全文
  • 在学习操作系统的时候,我们会学到系统安全的章节,而在这一块会有关于加密解密算法的学习。 一共有5种常见的加密解密算法:凯撒密码、字母倒排序、单表置换、维基利亚、转换加密算法。 我使用了js实现了这5种算法...

    在学习操作系统的时候,我们会学到系统安全的章节,而在这一块会有关于加密解密算法的学习。

    一共有5种常见的加密解密算法:凯撒密码、字母倒排序、单表置换、维基利亚、转换加密算法。 

    我使用了js实现了这5种算法,而且做了可视化处理、输入输出格式化处理,使得操作起来非常方便,下面是实现后整体的效果:

    1.这里是源代码下载地址(Github): 

    基于js的5种加密解密算法实现

     

    2.五种加密解密算法的基本原理

    ①单字母替换加密方法——恺撒密码

           加密方法是把英文字母按字母表的顺序编号作为明文,将密钥定为m,加密算法为将明文加上密钥m,得到密码表,通过相反的过程由密文得到明文。

    ②单字母替换加密方法——字母倒排序

           在加密、解密的过程中明文和密文按照字母表的顺序倒排对应,即A对应Z,B对应Y。  

    单字母替换加密方法——单表置换密码      

           由密钥Key构造字符置换表,完成加密和解密过程。

    ④多字母替换加密方法——维吉利亚密码

           假设明文m=m1 m2 m3 … mn;密钥k=k1k2 k3 … kn,对应密文c=c1 c2 c3 … cn,密文为:ci=(mi+ki )mod 26 ,26个字母的序号依次为0~25,ci , mi ,,ki是分别是密文明文密钥中第i个字母的序号。

    转换加密方法

           通过将明文每m个字符一组按顺序分为若干个字符串,再按照先列后行形成密文,并分析给出解密的方法。或者通过给出一个密钥字符串,将明文按密钥字符串长度按顺序分为若干组字符串,再按照密钥字符串各个字符的顺序形成密文,并分析给出解密的方法。

     

    3.基础功能设计

    ①清空功能:

      ②加密解密单选设计:

       ③菜单设置:

       ④消息提醒设置:

     

    4.测试过程 

    (一)凯撒密码

    ①加密实验

    输入数据:

    InputABCDEFGH

    Num4

    输出数据:

    OutputEFGHIJKL

     

    ②解密实验

    输入数据:


    InputEFGHIJKL

    Num4

    输出数据:


    OutputABCDEFGH

     

    (二)字母倒排序

    ①加密实验

    输入数据:


    Inputimportant

    输出数据:


    Outputrnkligzmg

     

    ②解密实验

    输入数据:


    Inputrnkligzmg

    输出数据:


    Outputimportant

     

    (三)单表置换

    ①加密实验

    输入数据:

    Inputimportant

    keyBEIJINGTSINGHUA(北京清华)

    输出数据:


    Output:HDLKOQBFQ

     

    ②解密实验

    输入数据:

    InputHDLKOQBFQ

    keyBEIJINGTSINGHUA(北京清华)

    输出数据:


    Output:important

     

    (四)维基利亚

    ①加密实验

    输入数据:

    Inputinformation

    keySTAR


    输出数据:

    OutputAGFFJFAKAHN

     

    ②解密实验

    输入数据:

    InputAGFFJFAKAHN

    keySTAR

    输出数据:

    Outputinformation

     

    (五)转换加密(1

    ①加密实验

    输入数据:

    Inputit can allow students to get close up views


    Num5

    输出数据:


    Outputiasngovtlttesiclusteeaodtcuwnweolps

     


    ②解密实验

    输入数据:

    Inputiasngovtlttesiclusteeaodtcuwnweolps

    Num5


    输出数据:

    Outputitcanallowstudentstogetcloseupviews

     

    (六)转换加密(2

    ①加密实验

    输入数据:


    Inputwu han university of technology

    KeyMISXTONG


    输出数据:

    OutputIOL*UETGWVFONYO*UTN*HREYNIH*ASC*

     

    ②解密实验

    输入数据:

    InputIOL*UETGWVFONYO*UTN*HREYNIH*ASC*


    输出数据:


    Outputwuhanuniversityoftechnology

     

    5.注意事项

       (一).本项目为了增加可操作性、增加视图画面感、进行输入输出验证,使用了Vue.js中数据绑定的功能以及Element UI插件

       (二).主体代码都在code_index.html中,代码总量600余行。进行了详细地标注

       (三).在转化加密的实现过程中会有一个不可避免的BUG,那就是当以相应的栅栏间隔对字符串进行分割形成相应二维数组的时候,由于其先行后列进行排序,再先列后行进行排序,所以如果二维数组尾部出现空字符,则在这个变化的过程中会无故丢失数据的结构,导致排序的错乱。

           我想到了两种解决方法:

          ①通过限时用户的输入格式,使得最终形成的二维数组不会有空字符存在,这样也就避免了相应的数据丢失,如下图所示:

     

          ②通过在先行后列和先列后行的排序中对于空字符进行识别,替换成一个特殊字符,以弥补数据结构的缺失,本实验中采用的是“*”这一特殊字符,如下图所示:

      (四)最后再次附上源码下载地址:基于js的5种加密解密算法实现 

     

    欢迎我的微信公众号【前端栈无不胜】

    会定期推送Js、Vue、React、Node、算法、面试等大前端技术博客、精选文章!

    展开全文
  • 简易可逆加密解密算法

    千次阅读 2016-12-05 23:57:05
    分享一个简单的可逆加密解密算法 1.基本原理 (1)使用base64_encode和base64_decode函数作为可逆的加密和解密工作函数 (2)把base64_encode出来的字符串通过某种方式进行分拆组成新的字符串实现加密 (3)把...

    分享一个简单的可逆加密解密算法

    1.基本原理

    (1)使用base64_encode和base64_decode函数作为可逆的加密和解密工作函数

    (2)把base64_encode出来的字符串通过某种方式进行分拆组成新的字符串实现加密

    (3)把字符串通过逆向的分拆组成原来生成的base64_encode出来的字符串,再用base64_decode函数实现解密

    2.具体实现

    (1)需求,用户登录后,需要把phone和password存储到cookie中,但是为了让cookie中的数据更安全,如隐藏phone这个隐私信息,同时又方便服务器读取解密实现自动登录

    (2)代码如下:

    // phone为11位,password为md5加密后的32位字符串
    $user_info = ['phone'=>12345678901, 'password'=>'1qaz2wsx3edc4rfv5tgb6yhn7ujm8ikk'];
    // 转为json字符串,可存入cookie,但有些信息可能会暴露
    // -------------以下为加密方法----------------
    $json = json_encode($user_info);
    // {"phone":12345678901,"password":"1qaz2wsx3edc4rfv5tgb6yhn7ujm8ikk"}
    // 转为base64字符串
    $b64 = base64_encode($json);
    // eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==
    // 长度为92,可以用"_"等字符补齐
    $fade_b64 = $b64.'________';
    // eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==________
    // 把得到的字符串按10的长度分割为10份
    $line_arr = [];
    for($i = 0; $i < 10; $i++) {
        $line_arr[] = substr($fade_b64, $i*10, 10);
    }
    // Array ( 
    //      [0] => eyJwaG9uZS |
    //      [1] => I6MTIzNDU2 |
    //      [2] => Nzg5MDEsIn |
    //      [3] => Bhc3N3b3Jk |
    //      [4] => IjoiMXFhej |
    //      [5] => J3c3gzZWRj |
    //      [6] => NHJmdjV0Z2 |
    //      [7] => I2eWhuN3Vq |
    //      [8] => bThpa2sifQ |
    //      [9] => ==________ V 
    //      先组装第一列eINBIJNIb=
    //      以此类推
    //  ) 
    // 对分割好的字符串进行重新组装
    $sign = '';
    for($i = 0; $i < 10; $i++) {
        for($j = 0; $j < 10; $j++) {
            $sign .= $line_arr[$j][$i];
        }
    }
    // 得到最终的加密串
    // eINBIJNIb=y6zhj3H2T=JMgcocJeh_wT53i3mWp_aIMNMgdha_GzD3Xzju2_9NEbFZVNs_uDs3hW03i_ZUIJeRZVf_S2nkjj2qQ_
    
    // -------------以下为解密方法----------------
    // 把字符串分为10为单位的10份
    $line_arr = [];
    for($i = 0; $i < 10; $i++) {
        $line_arr[] = substr($sign, $i*10, 10);
    }
    //
    // Array ( 
    //      [0] => eINBIJNIb= |
    //      [1] => y6zhj3H2T= |
    //      [2] => JMgcocJeh_ |
    //      [3] => wT53i3mWp_ |
    //      [4] => aIMNMgdha_ |
    //      [5] => GzD3Xzju2_ |
    //      [6] => 9NEbFZVNs_ |
    //      [7] => uDs3hW03i_ |
    //      [8] => ZUIJeRZVf_ |
    //      [9] => S2nkjj2qQ_ V
    //      先组装第一列eyJwaG9uZS
    //      以此类推
    //  )
    //
    $fade_b64 = '';
    for($i = 0; $i < 10; $i++) {
        for($j = 0; $j < 10; $j++) {
            $fade_b64 .= $line_arr[$j][$i];
        }
    }
    // 得到伪装过的b64字符串
    // eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==________
    $b64 = substr($fade_b64, 0, 92);
    // 取出混淆字符串"_"
    // eyJwaG9uZSI6MTIzNDU2Nzg5MDEsInBhc3N3b3JkIjoiMXFhejJ3c3gzZWRjNHJmdjV0Z2I2eWhuN3VqbThpa2sifQ==
    $json = base64_decode($b64);
    // 最终得到加密前的数据
    // {"phone":12345678901,"password":"1qaz2wsx3edc4rfv5tgb6yhn7ujm8ikk"}
    3.应用场景

    此种加密方法实现简单,可以把信息存储在像cookie这种暴露出来的应用中

    4.这只是想到的一种比较简单的可逆的加密解密方式,数据组装部分用了最简单的 “ 按列从上到下 ” 组装的方式,破解可能会比较容易,也可以用 " 按列从上到下,从下到上 " 混合、“ 对角线 ” 方法等,然后再加以字符的统一替换,如 a 全部替换为 A 等替换法,可以使加密效果更好,更不容易破解。最近用到了这种算法,与大家分享,当抛砖引玉了~用心,多动脑,就算是用php这种超级简单的语言,也可以做出厉害的东西!

    展开全文
  • 案例1: 换位加密解密算法 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class demo { static char[] jiami(char[] str, int n) /...
  • #region 字符串加密 /// <summary> /// 利用DES加密算法加密字符串(可解密) /// </summary> /// 被加密的字符串</param> /// 密钥(只支持8个字节的密钥)</param> /// <re
  • 常见的加密解密算法

    千次阅读 2019-09-16 11:15:24
    网络中传输敏感信息的时候通常会对字符串做加密解密处理 1.Base64位加密(可加密解密) 最简单的加密方式,没有密钥,这种方式只要让别人拿到你的密文,就可以直接解密,只能用来迷惑,一般情况下不单独使用,因为...
  • C语言加密解密算法

    千次阅读 2018-01-25 17:46:55
    本文介绍了英文字符串的加密解密过程。是根据网上一篇博客的题目重写的程序。 原文地址:http://blog.csdn.net/meditator_hkx/article/details/49445773 #include #include int AlphabetTransfer(char *...
  • Java简单实现DES加密解密算法

    千次阅读 2019-04-02 11:14:30
    Java简单实现DES加密解密算法 文章目录Java简单实现DES加密解密算法DES算法介绍实现相关java类代码实现 DES算法介绍 DEC加密算法属于对称加密,即利用指定的密钥,按照密码的长度截取数据,分成数据块,和密钥进行...
  • 三重DES加密解密算法

    千次阅读 2019-03-26 08:38:47
    三重DES加密解密算法 通过开发三重DES加密软件,进一步理解对称加密体制的基本原理;了解对称加密算法在文件保护中的应用;了解利用Java开发加密软件的方法和Java中关于加密的类。这里主要介绍定义的两种方法,下面...
  • 凯撒加密解密算法

    千次阅读 2019-07-11 19:05:15
    凯撒加密算法 把字母移动一定的位数来实现加密解密 比如A偏移3位就变成了D,用代码体现 public static void main(String[] args) { char ch = 'A'; int ascii = ch; int value = ch+3;//偏移...
  • Java实现DES加密解密算法

    千次阅读 2017-06-06 16:08:30
    DES算法全称为Data Encryption Standard,即数据加密算法,它是IBM公司于1975年研究成功并公开发表的。 DES算法入口参数有三个: key:8个字节共64位的工作密钥 data:8个字节共64位的需要被加密或被解密的数据 ...
  • RC4加密解密算法原理及实现 RC4加密解密算法的原理: 首先,通过我的理解,RC4算法所依赖的最根本原理是:对明文使用同一个密钥异或两次最后仍是得到原文。即生成密钥之后,由密钥与明文异或后生成密文(加密过程...
  • DES 加密解密算法 python 版

    千次阅读 2019-05-15 19:21:51
    工作需求:所有参数(数据库连接,服务器连接,都不能使用明文传参),所以需要一个加密解密算法,本来是想写 AES 的,但是 python 环境下各种改东西调试,好烦,所以退而求其次用 DES; DES 算法写了 java 版和 ...
  • 加密解密算法之RC4

    万次阅读 2018-04-22 12:31:50
    https://github.com/anthonywei/rc4 各种语言的rc4实现介绍RC4算法是一种对称加密算法,所谓对称加密,就是加密解密的过程是一样的.c=rc4(key,m) m=rc4(key,c)这种对称性是基于密匙流加密的特征。密匙流就是说我的...
  • PHP可逆加密解密算法

    千次阅读 2017-05-24 11:08:32
    对于需要还原的信息,则需要采用可逆的加密解密算法。 下面一组PHP函数是实现此加密解密的方法:   加密算法如下: Php代码  function encrypt($data, $key)  {   $ke
  • java AES 128 位加密解密算法

    万次阅读 2016-05-16 10:40:08
    最近在做app后台的服务器,使用到AES加密解密算法,无奈网上的都不符合要求,于是自己借鉴着写了一个AES加密解密工具。废话不多说,上代码import java.io.UnsupportedEncodingException; import java.security....
  • javascript DES加密解密算法

    千次阅读 2015-01-30 10:37:39
    javascript DES加密解密算法 源代码下载地址:http://www.zuidaima.com/share/1550463672044544.htm
  • C# DES加密解密算法

    千次阅读 2010-08-09 10:00:00
    C# DES加密解密算法#region DES Class /// /// ClassName: DES 加密类 /// DES加密、解密类库,字符串加密结果使用BASE64编码返回,支持文件的加密和解密 /// Time:2010-04-30 /// Auther:Hyey.wl /// ...
  • RSA加密解密算法

    千次阅读 2019-02-27 20:08:09
    1 引言 1.1 任务概要 本次课程设计即完成RSA算法...(4)设默认要加密的明文为31631,使用模重复平方法对该明文进行加密解密。 (5)给出辗转相除法求得解密用的参数d的演示过程,如图16演示。 (6)界面设计友...
  • *网上很多RC4算法在用的时候,都会出现「加密然后立即在内存中解密」可以,但先把加密后的密文写入文件再读取解密就失败的情况。这段代码没有这种情况。...*采用了重载函数,我用了String加密解密,成功。
  • android 中文件加密 解密 算法实战

    万次阅读 热门讨论 2014-03-10 15:43:34
    现在项目里面有一个需求,本项目里面下载的视频和文档都不允许通过其他的播放器播放,在培训机构里面这样的需求很多。...下载完成后存储文件的时候不是直接存储,要加密存储,加密方法是将文件的每个字节与这个字
  • [iOS]加密解密算法

    千次阅读 2014-05-24 14:56:15
    本文简单的归纳了一下iOS使用的各种加密解密算法(因为比较简单,所以本文不涉及具体的代码实现。未提及RSA加密算法的相关信息)。 对数据加密后进行保存/传输用得较多的是AES和DES,都是对称加密,相对来说AES速度...
  • 简单的加密解密算法

    千次阅读 2012-02-03 22:24:06
    本文描述一种项目中采用的简单加密解密算法,通过把多种算法进行组合。特点是同个字符串不同时间加密结果不同,混合了多种加密方式,很难用统计的方式对密文进行破解。 项目中仅是对密码进行加密,规定密码长度不...
  • 最近项目需求,要用php将一些普通的信息通过加密算法生成一个加密串,加密串能通过解密算法(逆向)解析出先前的信息。因为没有操作过,所以想问一下这里的朋友是否有现成的加解密算法的思路,算法需要够复杂不易被...
  • 凯撒密码的加密解密算法实现

    千次阅读 2020-03-10 23:28:59
    用C++实现凯撒密码的加密解密算法 在密码学中,恺撒密码(英语:Caesar cipher),或称恺撒加密、恺撒变换、变换加密,是一种最简单且最广为人知的加密技术。 它是一种替换加密的技术,明文中的所有字母都在字母表...
  • 目前常用的加密解密算法

    千次阅读 2014-11-05 20:31:11
    目前常用的加密解密算法 加密技术是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密文),其逆过程就是解码(解密)。加密技术的要点是加密算法,加密算法可以分为对称加密、...
  • RC4加密解密算法

    千次阅读 2020-08-29 14:40:48
    它加解密使用相同的密钥,因此也属于对称加密算法。RC4是有线等效加密(WEP)中采用的加密算法,也曾经是TLS可采用的算法之一。RC4算法特点:(1)、算法简洁易于软件实现,加密速度快,安全性比较高;(2)、密钥长度可...
  • DES-加密解密语言算法的C语言实现文档带有完整的源代码,可加密字符串或者文件,已通过测试使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 135,474
精华内容 54,189
关键字:

关于文件加密解密算法