Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,036

HOME > .NET Framework > Forum > การ เข้ารหัส - ถอดรหัส Password โดยใช้ Key ตาม Username ที่ตั้ง แต่.....



 

การ เข้ารหัส - ถอดรหัส Password โดยใช้ Key ตาม Username ที่ตั้ง แต่.....

 



Topic : 050453

Guest




ผมเขียน Function ในการเข้ารหัส Password ของ VB.net (2008)

โดยให้ KEY เป็น ตัวแปร Byte มี 2 ชุด

- ชุดแรก ตายตัว [font color=red]{34, 35, 36, 37, 38, 39, 40, 41}[/font]

- ชุดที่ 2 เปลี่ยนแปลง ตาม User Name ที่ตั้ง
+ ถ้า ตั้ง Username 8 ตัว ก็ใช้ตามนั้นเลย เป็น key
+ ถ้า ตั้ง Username มากกว่า 8 ตัว ให้ เอาแค่ 8 ตัวแรก มา เป็น Key
+ ถ้า ตั้ง Username น้อยกว่า 8 ตัว ให้ เอาตัวอักษรตัวแรกของ Username มาต่อให้ครบ 8 ตัว แล้วเอามาเป็น Key

Function ข้างล่าง รับค่า Username และ Password เข้ามาประมวลผล แล้ว ส่งออกเป็น Password ที่เข้ารหัสแล้ว

[font color=blue]ปัญหาคือถ้าผมต้องการถอดรหัส Password ที่เข้าไว้แล้ว จะเขียน Function ถอดรหัสอย่างไรดีครับ ช่วยหน่อย...[/font]



Name Space ที่ใช้

Imports System.Text
Imports System.IO
Imports System.Security.Cryptography


Code
Private Function EncryptPassword(ByVal _UserName As String, ByVal _Password As String) As String
Dim desCrypt As DESCryptoServiceProvider
Dim ms As MemoryStream
Dim cs As CryptoStream

Dim CurrentIV As Byte() = New Byte() {34, 35, 36, 37, 38, 39, 40, 41}
Dim CurrentKey As Byte() = {}

If (_UserName.Length = 8) Then
CurrentKey = Encoding.ASCII.GetBytes(_UserName)
ElseIf (_UserName.Length > 8) Then
CurrentKey = Encoding.ASCII.GetBytes(_UserName.Substring(0, 8))
Else
Dim i As Integer
Dim AddString As String = _UserName.Substring(0, 1)
Dim TotalLoop As Integer = 8 - CInt(_UserName.Length)
Dim tmpKey As String = _UserName

For i = 1 To TotalLoop
tmpKey = tmpKey & AddString
Next

CurrentKey = Encoding.ASCII.GetBytes(tmpKey)
End If

desCrypt = New DESCryptoServiceProvider()

With desCrypt
.IV = CurrentIV
.Key = CurrentKey
End With

ms = New MemoryStream()
ms.Position = 0

cs = New CryptoStream(ms, desCrypt.CreateEncryptor, CryptoStreamMode.Write)
Dim arrByte As Byte() = Encoding.ASCII.GetBytes(_Password)

cs.Write(arrByte, 0, arrByte.Length)
cs.FlushFinalBlock()
cs.Close()
Dim PwdWithEncrypt As String = Convert.ToBase64String(ms.ToArray())

Return PwdWithEncrypt
End Function




Tag : .NET, VBScript, VB.NET, VS 2003 (.NET 1.1), VS 2005 (.NET 2.x), VS 2008 (.NET 3.x)







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2010-10-19 16:40:00 By : Nt.J. View : 4372 Reply : 1
 

 

No. 1



โพสกระทู้ ( 3,144 )
บทความ ( 1 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์


จะใช้ vb ต้องเอาไป convert เอง

Security.cs
using System;
using System.Collections.Generic;
using System.Linq;

using System.IO;
using System.Runtime.InteropServices;
using System.Security.Cryptography;
using System.Text;

/// <summary>
/// Summary description for Security
/// </summary>
public class Security
{
    /// <summary>
    /// สำหรับเข้ารหัส และถอดรหัส
    /// </summary>
    public Security()
    {
        //
        // TODO: Add constructor logic here
        //
    }

    /// <summary>
    /// สร้าง Code สำหรับเปลี่ยนแปลงข้อมูลเพื่อความปลอดภัย
    /// </summary>
    /// <param name="EncryptString">ข้อความที่ต้องการเข้ารหัส</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>ข้อความที่เข้ารหัสแล้ว</returns>	
    public static string EncryptString(string EncryptString, string SecretKey)
    {
        MemoryStream msEncrypt = new MemoryStream();
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        string secretKey = (SecretKey.Length == 8) ? SecretKey : MD5(SecretKey);

        // Key ที่ต้องใช้งานกันทั้งสองฝ่าย ข้อมูลลับ
        DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);

        // ใช้ CreateEncryptor ในการเข้ารหัส
        ICryptoTransform myEncryptor = DES.CreateEncryptor();

        // ตัวแปร array สำหรับรับข้อความที่ต้องการเข้ารหัส ต้องแปลงเป็น ASCII
        byte[] pwd = ASCIIEncoding.ASCII.GetBytes(EncryptString);

        // เข้ารหัสข้อมูล ข้อมูลที่เข้ารหัสเรียบร้อยแล้วจะเก็บไว้ที่ msEncrypt
        CryptoStream myCryptoStream = new CryptoStream(msEncrypt, myEncryptor, CryptoStreamMode.Write);
        myCryptoStream.Write(pwd, 0, pwd.Length);
        myCryptoStream.Close();

        // ส่งค่าที่ encrypt แล้วกลับไป
        return Convert.ToBase64String(msEncrypt.ToArray());
    }

    /// <summary>
    /// ถอดรหัส Code
    /// </summary>
    /// <param name="DecryptString">ข้อความที่ต้องการถอดรหัส</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>ข้อความที่ถอดรหัสแล้ว</returns>
    public static string DecryptString(string DecryptString, string SecretKey)
    {
        MemoryStream msDecrypt = new MemoryStream();
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        string secretKey = (SecretKey.Length == 8) ? SecretKey : MD5(SecretKey);

        // Key ที่ต้องใช้งานกันทั้งสองฝ่าย ข้อมูลลับ
        DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);

        // ใช้ CreateDecryptor ในการเข้าถอดรหัส
        ICryptoTransform myDecryptor = DES.CreateDecryptor();

        // ตัวแปร array สำหรับรับข้อความที่ต้องการถอดรหัส ไม่ต้องแปลงเป็น ASCII
        byte[] pwd = Convert.FromBase64String(DecryptString);

        // เข้ารหัสข้อมูล ข้อมูลที่เข้ารหัสเรียบร้อยแล้วจะเก็บไว้ที่ msDecrypt
        CryptoStream cCryptoStream = new CryptoStream(msDecrypt, myDecryptor, CryptoStreamMode.Write);
        cCryptoStream.Write(pwd, 0, pwd.Length);
        cCryptoStream.Close();

        // ส่งค่าที่ decrypt แล้วกลับไป ต้องแปลงจาก ASCII ให้กลับเป็น string ก่อน
        return ASCIIEncoding.ASCII.GetString(msDecrypt.ToArray());
    }

    /// <summary>
    /// เข้ารหัสเอกสาร โดยส่งออกมาเป็น Binary Stream
    /// </summary>
    /// <param name="InputFilePath">ชื่อเอกสารที่ต้องการเข้ารหัส</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>Binary Stream ที่เข้ารหัสแล้ว</returns>
    public static byte[] EncryptStream(string InputFilePath, string SecretKey)
    {
        // read an file to new byte array
        byte[] byteArray = File.ReadAllBytes(InputFilePath);
        // write data to the new stream
        MemoryStream memoryStream = new MemoryStream(byteArray);

        return EncryptStream(memoryStream, SecretKey);
    }

    /// <summary>
    /// เข้ารหัสเอกสาร โดยส่งออกมาเป็น Binary Stream
    /// </summary>
    /// <param name="BinaryStream">Stream ที่ต้องการเข้ารหัส</param>
    /// <param name="StreamLength">ขนาดของ Stream</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>Binary Stream ที่เข้ารหัสแล้ว</returns>
    public static byte[] EncryptStream(Stream BinaryStream, string SecretKey)
    {
        BinaryReader BinaryRead = new BinaryReader(BinaryStream);
        byte[] binaryData = BinaryRead.ReadBytes(Convert.ToInt32(BinaryStream.Length));

        string secretKey = (SecretKey.Length == 8) ? SecretKey : MD5(SecretKey);

        //A 64 bit key and IV is required for this provider.
        //Set secret key For DES algorithm.
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey);

        //Create a DES decryptor from the DES instance.
        ICryptoTransform desencrypt = DES.CreateEncryptor();

        //Create crypto stream set to read and do a DES decryption transform on incoming bytes.
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptostream = new CryptoStream(memoryStream, desencrypt, CryptoStreamMode.Write);

        cryptostream.Write(binaryData, 0, binaryData.Length);
        cryptostream.FlushFinalBlock();
        cryptostream.Close();

        return memoryStream.ToArray();
    }

    /// <summary>
    /// เข้ารหัสเอกสาร
    /// </summary>
    /// <param name="InputFilePath">ชื่อเอกสารที่ต้องการเข้ารหัส</param>
    /// <param name="OutputFilePath">ชื่อเอกสารที่เข้ารหัสแล้ว</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    public static void EncryptFile(string InputFilePath, string OutputFilePath, string SecretKey)
    {
        //Create a encrypted file.
        FileStream fsEncrypted = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write);

        //Print the contents of the Encrypted file.
        byte[] byteArray = EncryptStream(InputFilePath, SecretKey);
        fsEncrypted.Write(byteArray, 0, byteArray.Length);
        fsEncrypted.Close();
    }

    /// <summary>
    /// เข้ารหัสเอกสาร
    /// </summary>
    /// <param name="BinaryStream">Stream ที่ต้องการเข้ารหัส</param>
    /// <param name="StreamLength">ขนาดของ Stream</param>
    /// <param name="OutputFilePath">ชื่อเอกสารที่เข้ารหัสแล้ว</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    public static void EncryptFile(Stream BinaryStream, string OutputFilePath, string SecretKey)
    {
        //Create a encrypted file.
        FileStream fsEncrypted = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write);

        //Print the contents of the Encrypted file.
        byte[] byteArray = EncryptStream(BinaryStream, SecretKey);
        fsEncrypted.Write(byteArray, 0, byteArray.Length);
        fsEncrypted.Close();
    }

    /// <summary>
    /// ถอดรหัสเอกสาร โดยส่งออกมาเป็น Binary Stream
    /// </summary>
    /// <param name="InputFilePath">ชื่อเอกสารที่ต้องการถอดรหัส</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>Binary Stream ที่ถอดรหัสแล้ว</returns>
    public static byte[] DecryptStream(string InputFilePath, string SecretKey)
    {
        // read an file to new byte array
        byte[] byteArray = File.ReadAllBytes(InputFilePath);
        // write data to the new stream
        MemoryStream memoryStream = new MemoryStream(byteArray);

        return DecryptStream(memoryStream, SecretKey);
    }

    /// <summary>
    /// ถอดรหัสเอกสาร โดยส่งออกมาเป็น Binary Stream
    /// </summary>
    /// <param name="BinaryStream">Stream ที่ต้องการถอดรหัส</param>
    /// <param name="StreamLength">ขนาดของ Stream</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>Binary Stream ที่ถอดรหัสแล้ว</returns>
    public static byte[] DecryptStream(Stream BinaryStream, string SecretKey)
    {
        BinaryReader BinaryRead = new BinaryReader(BinaryStream);
        byte[] binaryData = BinaryRead.ReadBytes(Convert.ToInt32(BinaryStream.Length));

        string secretKey = (SecretKey.Length == 8) ? SecretKey : MD5(SecretKey);

        //A 64 bit key and IV is required for this provider.
        //Set secret key For DES algorithm.
        DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
        DES.Key = ASCIIEncoding.ASCII.GetBytes(secretKey);
        DES.IV = ASCIIEncoding.ASCII.GetBytes(secretKey); //Set initialization vector.

        //Create a DES decryptor from the DES instance.
        ICryptoTransform desdecrypt = DES.CreateDecryptor();

        //Create crypto stream set to read and do a DES decryption transform on incoming bytes.
        MemoryStream memoryStream = new MemoryStream();
        CryptoStream cryptostreamDecr = new CryptoStream(memoryStream, desdecrypt, CryptoStreamMode.Write);

        cryptostreamDecr.Write(binaryData, 0, binaryData.Length);
        cryptostreamDecr.FlushFinalBlock();
        cryptostreamDecr.Close();

        return memoryStream.ToArray();
    }

    /// <summary>
    /// ถอดรหัสเอกสาร
    /// </summary>
    /// <param name="InputFilePath">ชื่อเอกสารที่ต้องการถอดรหัส</</param>
    /// <param name="OutputFilePath">ชื่อเอกสารที่ถอดรหัสแล้ว</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    public static void DecryptFile(string InputFilePath, string OutputFilePath, string SecretKey)
    {
        //Create a file stream to read the encrypted file back.
        FileStream fsDecrypted = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write);

        //Print the contents of the Decrypted file.
        byte[] byteArray = DecryptStream(InputFilePath, SecretKey);
        fsDecrypted.Write(byteArray, 0, byteArray.Length);
        fsDecrypted.Close();
    }

    /// <summary>
    /// ถอดรหัสเอกสาร
    /// </summary>
    /// <param name="BinaryStream">Stream ที่ต้องการถอดรหัส</param>
    /// <param name="StreamLength">ขนาดของ Stream</param>
    /// <param name="OutputFilePath">ชื่อเอกสารที่ถอดรหัสแล้ว</param>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    public static void DecryptFile(Stream BinaryStream, string OutputFilePath, string SecretKey)
    {
        //Create a file stream to read the encrypted file back.
        FileStream fsDecrypted = new FileStream(OutputFilePath, FileMode.Create, FileAccess.Write);

        //Print the contents of the Decrypted file.
        byte[] byteArray = DecryptStream(BinaryStream, SecretKey);
        fsDecrypted.Write(byteArray, 0, byteArray.Length);
        fsDecrypted.Close();
    }

    /// <summary>
    /// สร้าง 64 bits Key สำหรับเข้ารหัสและถอดรหัส
    /// </summary>
    /// <returns>64 bits Key สำหรับเข้ารหัสและถอดรหัส</returns>
    public static string GenerateKey()
    {
        // Create an instance of Symetric Algorithm. Key and IV is generated automatically.
        DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();

        // Use the Automatically generated key for Encryption. 
        return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
    }

    /// <summary>
    /// ลบข้อมูล Key ออกจากหนวยความจำ
    /// </summary>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    public static void RemoveKey(string SecretKey)
    {
        // For additional security Pin the key.
        GCHandle gch = GCHandle.Alloc(SecretKey, GCHandleType.Pinned);

        // Remove the Key from memory. 
        ZeroMemory(gch.AddrOfPinnedObject(), SecretKey.Length * 2);
        gch.Free();
    }

    /// <summary>
    /// สร้าง 64 bits Key สำหรับเข้ารหัสและถอดรหัส
    /// </summary>
    /// <param name="SecretKey">Key สำหรับเข้ารหัสและถอดรหัส</param>
    /// <returns>64 bits Key สำหรับเข้ารหัสและถอดรหัส</returns>
    private static string MD5(string SecretKey)
    {
        string strReturn = string.Empty;
        byte[] ByteSourceText = ASCIIEncoding.ASCII.GetBytes(SecretKey);

        MD5CryptoServiceProvider Md5Hash = new MD5CryptoServiceProvider();
        byte[] ByteHash = Md5Hash.ComputeHash(ByteSourceText);

        foreach (byte b in ByteHash)
            strReturn = strReturn + b.ToString("x2");

        return strReturn.Substring(0, 8);
    }

    //  Call this function to remove the key from memory after use for security
    [DllImport("KERNEL32.DLL", EntryPoint = "RtlZeroMemory")]
    private static extern bool ZeroMemory(IntPtr Destination, int Length);
}







แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2010-10-19 22:17:15 By : tungman
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : การ เข้ารหัส - ถอดรหัส Password โดยใช้ Key ตาม Username ที่ตั้ง แต่.....
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 04
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่