การเข้ารหัสสามารถช่วยปกป้องข้อมูลจากการดูและแก้ไข และช่วยให้มีวิธีการสื่อสารที่ปลอดภัยผ่านช่องทางที่ไม่ปลอดภัย ตัวอย่างเช่น ข้อมูลสามารถเข้ารหัสได้โดยใช้อัลกอริธึมการเข้ารหัส ส่งในสถานะที่เข้ารหัส จากนั้นถอดรหัสโดยผู้รับที่ต้องการ หากบุคคลที่สามสกัดกั้นข้อมูลที่เข้ารหัส จะเป็นการยากที่จะถอดรหัสข้อมูล
เพื่อให้บรรลุเป้าหมายเหล่านี้ คุณจะต้องสร้างแผนการเข้ารหัสโดยใช้การผสมผสานระหว่างอัลกอริธึมและแบบแผนที่เรียกว่าการเข้ารหัสเบื้องต้น รวมถึงการเข้ารหัสคีย์ส่วนตัว (การเข้ารหัสแบบสมมาตร) การเข้ารหัสคีย์สาธารณะ (การเข้ารหัสแบบอสมมาตร) ลายเซ็นการเข้ารหัส และแฮชการเข้ารหัส
เราใช้การเข้ารหัสคีย์สาธารณะ (การเข้ารหัสแบบอสมมาตร) เพื่อใช้อัลกอริทึมรหัสการลงทะเบียน
การเข้ารหัสคีย์สาธารณะใช้คีย์ส่วนตัวที่ต้องเก็บเป็นความลับจากผู้ใช้ที่ไม่ได้รับอนุญาต และคีย์สาธารณะที่เปิดเผยต่อสาธารณะได้ ทั้งกุญแจสาธารณะและกุญแจส่วนตัวมีความสัมพันธ์กันทางคณิตศาสตร์ ข้อมูลที่เข้ารหัสด้วยกุญแจสาธารณะสามารถถอดรหัสได้ด้วยกุญแจส่วนตัวเท่านั้น ในขณะที่ข้อมูลที่เซ็นชื่อด้วยกุญแจส่วนตัวสามารถตรวจสอบได้ด้วยกุญแจสาธารณะเท่านั้น
สำหรับรหัสการลงทะเบียน เราใช้คีย์ส่วนตัวเพื่อเซ็นชื่อสตริง (ชื่อผู้ใช้) จากนั้นใช้คีย์สาธารณะเพื่อตรวจสอบลายเซ็น (รหัสลงทะเบียน) เนื่องจากกุญแจสาธารณะสามารถใช้เพื่อการตรวจสอบเท่านั้น เราจึงสามารถแจกจ่ายกุญแจสาธารณะได้อย่างมั่นใจ กุญแจส่วนตัวจะถูกใช้ในการลงนาม ดังนั้นกุญแจส่วนตัวจึงต้องถูกเก็บไว้ในมือของนักพัฒนา ด้วยวิธีนี้ บรรลุวัตถุประสงค์ของการรับรองการจดทะเบียน ซอฟต์แวร์ทั้งหมดที่ลงทะเบียนในปัจจุบันโดยใช้โหมด "ชื่อผู้ใช้ รหัสการลงทะเบียน" ควรใช้เทคโนโลยีนี้
ขั้นแรกเราสร้างกุญแจสาธารณะและกุญแจส่วนตัวที่เราต้องการใช้
rsa ส่วนตัวในรูปแบบใหม่ Security.Cryptography.RSACryptoServiceProvider
คลาส RSACryptoServiceProvider จัดให้มีการนำอัลกอริทึม RSA ไปใช้เพื่อทำการเข้ารหัสและถอดรหัสแบบไม่สมมาตร กุญแจสาธารณะและกุญแจส่วนตัวที่เราต้องการสามารถสร้างได้ผ่าน ToXMLString
rsa.ToXmlString(False)
rsa.ToXmlString(True)
เมื่อพารามิเตอร์เป็น False จะมีการสร้างเฉพาะพับลิกคีย์เท่านั้น เมื่อเป็น True ทั้งพับลิกคีย์และไพรเวตคีย์จะถูกสร้างขึ้น โดยทั่วไปเราได้รับสตริงคีย์สาธารณะผ่าน ToXmlString(False) รับสตริงคีย์ส่วนตัวผ่าน ToXmlString(True) (แม้ว่าจะมีคีย์สาธารณะอยู่ก็ตาม) เราสามารถบันทึกคีย์ทั้งสองนี้ไว้ในเครื่องโลคัล กำหนดและใช้งานผ่านค่าคงที่สตริง กล่าวอีกนัยหนึ่ง ข้อมูลการลงทะเบียนของเราจะใช้กุญแจสาธารณะและกุญแจส่วนตัวที่ไม่ซ้ำกัน
จากนั้นเราจะเซ็นชื่อสตริงที่ระบุด้วยคีย์สาธารณะและคีย์ส่วนตัว
rsa.FromXmlString(PRIVATE_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureFormatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim source() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(UID)
Dim sha As New Security .Cryptography.SHA1Managed
Dim result() As Byte = sha.ComputeHash(source)
Dim regkey() As Byte = f.CreateSignature(result)
SerialNumber = Convert.ToBase64String(regkey)
เริ่มต้นวัตถุ rsa อีกครั้งด้วยคีย์ส่วนตัวที่เพิ่งได้รับ จากนั้น Signature จะดำเนินการผ่านคลาส RSAPKCS1SignatureFormatter เราแปลงสตริงอินพุตเป็นอาร์เรย์ไบต์ (ชื่อผู้ใช้เริ่มต้นของเราที่นี่สามารถประกอบด้วยอักขระ ASCII เท่านั้น) และคำนวณค่าแฮชผ่านอัลกอริทึมการแฮช SHA1 จากนั้นใช้เมธอด CreateSignature เพื่อลงนามค่าแฮชที่ได้รับ สุดท้าย เราจะแปลงอาร์เรย์ไบต์ที่ได้รับเป็นสตริงเป็นรหัสการลงทะเบียน นี่คือกระบวนการสร้างรหัสการลงทะเบียน เราสามารถใช้โปรแกรมนี้ซ้ำเพื่อลงนามชื่อผู้ใช้ที่แตกต่างกันเพื่อรับรหัสการลงทะเบียนที่แตกต่างกัน
สุดท้าย เราจะตรวจสอบชื่อผู้ใช้และรหัสลงทะเบียนที่เราเพิ่งได้รับ
rsa.FromXmlString(PUBLIC_KEY)
Dim f As New Security.Cryptography.RSAPKCS1SignatureDeformatter(rsa)
f.SetHashAlgorithm("SHA1")
Dim key() As Byte = Convert.FromBase64String(SerialNumber)
Dim sha As New Security.Cryptography.SHA1Managed
Dim name () As Byte = sha.ComputeHash(System.Text.ASCIIEncoding.ASCII.GetBytes(UID))
Result = f.VerifySignature(name, key)
คราวนี้เราใช้คีย์สาธารณะเพื่อเริ่มต้นวัตถุ rsa จากนั้นตรวจสอบลายเซ็น ผ่านคลาส RSAPKCS1SignatureDeformatter เราแปลงรหัสการลงทะเบียนที่ได้รับกลับเป็นอาร์เรย์ไบต์ และดำเนินการคำนวณแฮชกับชื่อผู้ใช้เพื่อรับค่าแฮช สุดท้าย ตรวจสอบผ่าน VerifySignature
ดังที่เห็นได้จากโปรแกรมข้างต้น จำเป็นต้องใช้รหัสส่วนตัวเพื่อสร้างรหัสการลงทะเบียน (รหัสส่วนตัวจะมาพร้อมกับข้อมูลกุญแจสาธารณะ) และสามารถสร้างคู่ชื่อผู้ใช้และรหัสการลงทะเบียนจำนวนเท่าใดก็ได้ ด้วยกุญแจสาธารณะ เราทำได้เพียงตรวจสอบแต่ไม่สามารถสร้างได้ ดังนั้นจึงสามารถแจกจ่ายกุญแจสาธารณะให้กับผู้ใช้ทุกคนได้อย่างปลอดภัยเพื่อการตรวจสอบ แต่กุญแจส่วนตัวไม่สามารถทำได้ ดังนั้นรหัสสาธารณะและอัลกอริธึมการตรวจสอบจึงสามารถรวมไว้ในเวอร์ชันที่เผยแพร่ได้ เพราะแม้ว่าผู้ใช้จะได้รับกุญแจสาธารณะและอัลกอริธึมการตรวจสอบ แต่ก็ไม่สามารถถอดรหัสได้ง่าย
เครื่องลงทะเบียนที่ได้รับความนิยมบนอินเทอร์เน็ตทุกวันนี้สามารถถอดรหัสคีย์ส่วนตัวของซอฟต์แวร์ได้เป็นส่วนใหญ่ ดังนั้นจึงสามารถสร้างข้อมูลการลงทะเบียนที่จำเป็นได้อย่างไม่จำกัด แต่ถ้าผู้ใช้แยกส่วนผลิตภัณฑ์ของคุณและแก้ไขโค้ดระดับกลาง มันจะข้ามตรรกะการตัดสินการลงทะเบียน นี่ไม่ใช่ปัญหาที่บทความนี้สามารถแก้ไขได้ เพราะแม้ว่าคุณจะใช้เทคโนโลยีบริการเว็บสำหรับการเปิดใช้งานหรือการลงทะเบียนออนไลน์ คุณยังคงสามารถวิเคราะห์ข้อมูลเซิร์ฟเวอร์ผ่านการฟังเครือข่ายและจำลองเซิร์ฟเวอร์ปลอมได้
http://www.cnblogs.com/farrio/archive/2006/12/01/579296.html