c# 幾種常見的加密方法的實現


1.ACSII碼加密

//ACSII碼加密
        private static string ACSIIPWd(string rpwd)
        {
            string Ret;
            byte[] array = System.Text.Encoding.ASCII.GetBytes(rpwd);
            byte[] byteArray = new byte[array.Length];

            for (int i = 0; i < array.Length; i++)
            {
                int asciicode = (int)(array[i]);
                asciicode = asciicode + 1;
                byteArray[i] = (byte)asciicode;
            }
            System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
            string strCharacter = asciiEncoding.GetString(byteArray);
            Ret = strCharacter;
            return Ret;
        }

2.MD5加密

//MD5加密
        private static string MD5PWd(string rpwd)
        {
            string Ret;

            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] palindata = Encoding.Default.GetBytes(rpwd);//將要加密的字符串轉換為字節數組
            byte[] encryptdata = md5.ComputeHash(palindata);//將字符串加密后也轉換為字符數組
            Ret = Convert.ToBase64String(encryptdata);
            return Ret;
        }

 


3.RSA加密

//RSA加密
        private static string RSAPWD1(string myKeyContainerName)
        {
            string ret = "";         
            CspParameters cp = new CspParameters();
            cp.KeyContainerName = myKeyContainerName;
            RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
           
            ret = rsa.ToXmlString(true);
            Console.WriteLine("Key is : \n" + rsa.ToXmlString(true));
            return ret;

        }

 rsa詳解: https://www.cnblogs.com/ButterflyEffect/p/9494061.html

 

4.DES加密

//DES加密  
        private static string DESPWD(string ciphertext)
        {
            string desPWD = ""; 
            byte[] buffer;
            DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();

            MemoryStream ms = new MemoryStream();//先創建 一個內存流
            CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateEncryptor(), CryptoStreamMode.Write);//將內存流連接到加密轉換流
            StreamWriter sw = new StreamWriter(cryStream);
            sw.WriteLine(ciphertext);//將要加密的字符串寫入加密轉換流
            sw.Close();
            cryStream.Close();
            buffer = ms.ToArray();//將加密后的流轉換為字節數組
            desPWD = Convert.ToBase64String(buffer);//將加密后的字節數組轉換為字符串

            return desPWD;
        }

 

5.base64

  ///編碼
        public static string EncodeBase64(string code_type, string code)
        {
            string encode = "";
            byte[] bytes = Encoding.GetEncoding(code_type).GetBytes(code);
            try
            {
                encode = Convert.ToBase64String(bytes);
            }
            catch
            {
                encode = code;
            }
            return encode;
        }
        ///解碼
        public static string DecodeBase64(string code_type, string code)
        {
            string decode = "";
            byte[] bytes = Convert.FromBase64String(code);
            try
            {
                decode = Encoding.GetEncoding(code_type).GetString(bytes);
            }
            catch
            {
                decode = code;
            }
            return decode;
        }

 

6.感知哈希法

第一步,縮小尺寸。

將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。

 

第二步,簡化色彩。

將縮小后的圖片,轉為64級灰度。也就是說,所有像素點總共只有64種顏色。

第三步,計算平均值。

計算所有64個像素的灰度平均值。

第四步,比較像素的灰度。

將每個像素的灰度,與平均值進行比較。大於或等於平均值,記為1;小於平均值,記為0。

第五步,計算哈希值。

將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序並不重要,只要保證所有圖片都采用同樣次序就行了。

 =  = 8f373714acfcf4d0

得到指紋以后,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同於計算"漢明距離"(Hamming distance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大於10,就說明這是兩張不同的圖片。

具體的代碼實現,可以參見Wote用python語言寫的imgHash.py。代碼很短,只有53行。使用的時候,第一個參數是基准圖片,第二個參數是用來比較的其他圖片所在的目錄,返回結果是兩張圖片之間不相同的數據位數量(漢明距離)。

這種算法的優點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來了。所以,它的最佳用途是根據縮略圖,找出原圖。

實際應用中,往往采用更強大的pHash算法和SIFT算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉化成Hash字符串,然后再進行比較。

原文:http://www.ruanyifeng.com/blog/2011/07/principle_of_similar_image_search.html

#!/usr/bin/python

import glob
import os
import sys

from PIL import Image

EXTS = 'jpg', 'jpeg', 'JPG', 'JPEG', 'gif', 'GIF', 'png', 'PNG'

def avhash(im):
    if not isinstance(im, Image.Image):
        im = Image.open(im)
    im = im.resize((8, 8), Image.ANTIALIAS).convert('L')
    avg = reduce(lambda x, y: x + y, im.getdata()) / 64.
    return reduce(lambda x, (y, z): x | (z << y),
                  enumerate(map(lambda i: 0 if i < avg else 1, im.getdata())),
                  0)

def hamming(h1, h2):
    h, d = 0, h1 ^ h2
    while d:
        h += 1
        d &= d - 1
    return h

if __name__ == '__main__':
    if len(sys.argv) <= 1 or len(sys.argv) > 3:
        print "Usage: %s image.jpg [dir]" % sys.argv[0]
    else:
        im, wd = sys.argv[1], '.' if len(sys.argv) < 3 else sys.argv[2]
        h = avhash(im)

        os.chdir(wd)
        images = []
        for ext in EXTS:
            images.extend(glob.glob('*.%s' % ext))

        seq = []
        prog = int(len(images) > 50 and sys.stdout.isatty())
        for f in images:
            seq.append((f, hamming(avhash(f), h)))
            if prog:
                perc = 100. * prog / len(images)
                x = int(2 * perc / 5)
                print '\rCalculating... [' + '#' * x + ' ' * (40 - x) + ']',
                print '%.2f%%' % perc, '(%d/%d)' % (prog, len(images)),
                sys.stdout.flush()
                prog += 1

        if prog: print
        for f, ham in sorted(seq, key=lambda i: i[1]):
            print "%d\t%s" % (ham, f)

 
























免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM