Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

"Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

Îåêßíçóå áðü ôï ìÝëïò DrMad. Τελευταία δημοσίευση από το μέλος ioagia στις 25-07-2012, 16:40. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  31-07-2006, 00:28 15321

    "Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

    Είστε τεμπέλης?

    Θέλετε να προστατεύσετε κάποιο string με τον πιό ανασφαλή αλλά και γρήγορο τρόπο?

    Θα θυσιάζατε την αποτελεσματικότητα του κώδικά σας έναντι της ταχύτητας που απαιτείται για να τον γράψετε?

    Εάν απαντήσατε ναι στις παραπάνω ερωτήσεις, τότε η παρακάτω function είναι για εσάς: Βάζεις το κείμενο και το κωδικοποιεί, βάζεις το κωδικοποιημένο και το αποκωδικοποιεί, δεν είναι υψηλά μαθηματικά, αλλά εμένα με βόλεψε πολύ:

    Την βρήκα στο: http://www.codeguru.com/vb/gen/vb_misc/encryption/article.php/c10343/



     Public Function SimpleCrypt( _

     ByVal Text As String) As String

     ' Encrypts/decrypts the passed string using

     ' a simple ASCII value-swapping algorithm

     Dim strTempChar As String, i As Integer

     For i = 1 To Len(Text)

     If Asc(Mid$(Text, i, 1)) < 128 Then

     strTempChar = _

     CType(Asc(Mid$(Text, i, 1)) + 128, String)

     ElseIf Asc(Mid$(Text, i, 1)) > 128 Then

     strTempChar = _

     CType(Asc(Mid$(Text, i, 1)) - 128, String)

     End If

     Mid$(Text, i, 1) = _

     Chr(CType(strTempChar, Integer))

     Next i

     Return Text

     End Function

     

     

    και ένα απλό παράδειγμα που έχει στο site



    Dim MyText As String

    Encrypt MyText = "Karl Moore"

    MyText = Crypt(MyText) MessageBox.Show(MyText) 

     Decrypt MyText = Crypt(MyText)

    MessageBox.Show(MyText)


    Μισώ τα ξυπνητήρια!!!!!!
  •  31-07-2006, 10:44 15332 σε απάντηση της 15321

    Απ: "Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

    Αγαπητέ φίλε, χωρίς να θέλω να σε προσβάλω δεν σου φταίνε σε τίποτα οι μπακάληδες. Είναι Χρησιμότατοι, είναι δίπλα σου και σου παρέχουν τα απαραίτητα ταχύτατα αλλά κοστίζουν. Κάτι δηλαδή σαν την L2 cache.

    Υπάρχουν τόσοι έτοιμοι αλγόριθμοι κρυπτογράφησης που περιμένουν απλά να τους καλέσεις, που καθυστούν το copy-paste του κώδικά σου πολύ κουραστικό για έναν τεμπέλη σαν κι εμένα.

    Μάριος

  •  31-07-2006, 22:20 15356 σε απάντηση της 15332

    Απ: "Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

    Ο agmarios δεν έχει κι άδικο. Το .NET περιλαμβάνει έτοιμους αλγόριθμους όπως TripleDES και το στάνταρ AES (αν και το ονομάζει Rijndael). Επειδή όμως οι κλάσεις των αλγορίθμων είναι για γενική χρήση, η χρήση τους για string encryption είναι λίγο περίεργη. Από την άλλη, έτσι και γράψει κανείς μία φορά τις συναρτήσεις για encrypt/decrypt, μπορεί να τις χρησιμοποιήσει όπου θέλει. Πραγματικά, δεν υπάρχει λόγος να χρησιμοποιεί κανείς αδύναμους αλγόριθμους κρυπτογράφησης όταν μπορεί να χρησιμοποιήσει εύκολα δυνατούς και ασφαλείς αλγόριθμους.

    Μία εύκολη υλοποίηση είναι η κλάση Encryption64 που περιγράφεται στο http://www.devcity.net/Articles/47/1/encrypt_querystring.aspx . Η κλάση αυτή χρησιμοποιεί τον αλγόριθμο DES για να κρυπτογραφήσει strings, ο οποίος όμως θεωρείται ανασφαλής. Αλλάζοντας απλά την κλάση DESCryptoServiceProvider με την RijndaelManaged, η κλάση μπορεί να χρησιμοποιήσει τον αλγόριθμο AES (Rijndael). Ο τροποποιημένος κώδικας είναι ο εξής:

    Imports System
    Imports System.IO
    Imports System.Xml
    Imports System.Text
    Imports System.Security.Cryptography
    Imports NUnit.Framework

    Public Class Encryption64
        Private key() As Byte = {}
        Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF, &H1A, &H2B, &H3C, &H4D, &H5E, &H6F, &H70, &HA1}

        Public Function Decrypt(ByVal stringToDecrypt As String, _
            ByVal sEncryptionKey As String) As String
            Dim inputByteArray(stringToDecrypt.Length) As Byte
            key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
            Dim crypto As New RijndaelManaged()

            inputByteArray = Convert.FromBase64String(stringToDecrypt)
            Dim ms As New MemoryStream()
            Dim cs As New CryptoStream(ms, crypto.CreateDecryptor(key, IV), _
                CryptoStreamMode.Write)
            cs.Write(inputByteArray, 0, inputByteArray.Length)
            cs.FlushFinalBlock()
            Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
            Return encoding.GetString(ms.ToArray())
        End Function

        Public Function Encrypt(ByVal stringToEncrypt As String, _
            ByVal SEncryptionKey As String) As String
            key = System.Text.Encoding.UTF8.GetBytes(Left(SEncryptionKey, 8))
            Dim crypto As New RijndaelManaged()
            Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes( _
                stringToEncrypt)
            Dim ms As New MemoryStream()
            Dim cs As New CryptoStream(ms, crypto.CreateEncryptor(key, IV), _
                CryptoStreamMode.Write)
            cs.Write(inputByteArray, 0, inputByteArray.Length)
            cs.FlushFinalBlock()
            Return Convert.ToBase64String(ms.ToArray())
        End Function

    End Class

    Και ένα παράδειγμα χρήσης:

    Dim encrypter As New Encryption64
    Dim clearText As String = "Hello World!"
    Dim encryptedString = encrypter.Encrypt(clearText, "MyPassword")
    Dim decryptedString = encrypter.Decrypt(encryptedString, "MyPassword")

    Εδώ χρειάζονται και λίγες εξηγήσεις για το τί είναι IV. Οι ισχυροί αλγόριθμοι κρυπτογράφησης δουλεύουν επάνω σε block από δεδομένα αντί για ένα-ένα byte. Το κάθε block που κρυπτογραφείται χρησιμοποιείται σαν βάση για την κρυπτογράφηση του επόμενου block. Αυτό όμως σημαίνει ότι κάπου πρέπει να δωθεί το πρώτο "κρυπτογραφημένο" block. Αυτός είναι ο ρόλος του IV (initialization vector) το οποίο καλό θα είναι να αποτελείται από τυχαία νούμερα. Στο παραπάνω παράδειγμα τα νούμερα δεν είναι και πολύ τυχαία, αλλά ο καθένας μπορεί να τα αλλάξει. Τέλος, για καλύτερη ασφάλεια δεν χρησιμοποιούμε το ίδιο το κλειδί αλλά μία μορφή του που έχει γίνει hash μερικές δεκάδες φορές.

    Ευτυχώς, έτσι και γράψεις μία φορά μια κλάση όπως η Encryption64 δεν χρειάζεται να ασχοληθείς ξανά με τις λεπτομέρειες υλοποίησης. Μπορείς έτσι με δύο γραμμές κώδικα, την Encrypt και την Decrypt να έχεις όσο δυνατή κρυπτογράφηση θέλεις.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  01-08-2006, 10:32 15359 σε απάντηση της 15356

    Απ: "Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

     pkanavos wrote:
    Ευτυχώς, έτσι και γράψεις μία φορά μια κλάση όπως η Encryption64 δεν χρειάζεται να ασχοληθείς ξανά με τις λεπτομέρειες υλοποίησης. Μπορείς έτσι με δύο γραμμές κώδικα, την Encrypt και την Decrypt να έχεις όσο δυνατή κρυπτογράφηση θέλεις.


    Βέβαια παρουσιάζεται μετά μπροστά σου το επόμενο πρόβλημα: Πώς θα προστατέψεις το password από τον disassembler Smile
    Ακόμα και στον unmanaged κόσμο, ένα strings xxx.dll μπορεί να σου το εμφανίσει σε χρόνο μηδέν.
    Αν δε το ζητάς από το χρήστη και δεν είναι αποθηκευμένο σε κάποιο secure store, καταλήγουμε στο πρόβλημα της κότας και του αυγού...

    Νατάσα Μανουσοπούλου
  •  01-08-2006, 11:00 15360 σε απάντηση της 15359

    Απ: "Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

    Το θέμα στο οποίο αναφέρεσαι θέλει πολύ συζήτηση και δεν είναι και αυτό στο οποίο αναφέρονται ο DrMad και ο agmarios. Το ζητούμενο είναι πως μπορεί κανείς με απλές κλήσεις να έχει καλό encryption χωρίς να γράψει το δικό του από την αρχή. Από που θα έρθει τώρα το string? Από το χρήστη, από το registry, από το Isolated Storage, δεν έχει σημασία. Σημασία έχει ότι το .NET σου επιτρέπει με λίγες γραμμές κώδικα να έχεις αρκετά καλό encryption.

    Αν κάποιος θέλει να έχει όσο πιο ασφαλές encryption γίνεται δεν χρησιμοποιεί καν το password που δίνει ο χρήστης, αλλά το περνάει από hash function μερικές δεκάδες φορές. Επίσης, φροντίζει να μείνει κρυφό και το IV. Και για ακόμα μεγαλύτερη ασφάλεια, χρησιμοποιεί αλγόριθμους public key για να προστατέψει το κλειδί. Και επειδή δεν μπορείς να εμπιστευτείς το public key που σου δίνει ο άλλος, χρησιμοποιείς ένα public key management system, όπως τα certificate services των Windows για να εξασφαλίσεις την εγκυρότητα των κλειδιών. Επίσης, αντί να χρησιμοποιείς το String για την αποθήκευση του password στη μνήμη, χρησιμοποιείς το SecureString, το οποίο παραμένει κρυπτογραφημένο στη μνήμη και δεν γράφεται ποτέ στο page file, για να μην μπορεί ούτε ένας debugger να διαβάσει το string.

    Όλα αυτά όμως είναι overkill όταν το ζητούμενο είναι απλά μία συνάρτηση η οποία θα κρυπτογραφεί ένα string χρησιμοποιώντας ένα άλλο ως password.
    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  25-07-2012, 16:40 70976 σε απάντηση της 15356

    Απ: "Μπακάλικη" κρυπτογράφηση strings σε 12 γραμμές κώδικα

    Παναγιώτη

    ο κώδικας της κρυπτογράφησης τρέχει μια χαρά.

    Αν καταλαβαίνω σωστά αναφέρεται σε 64bit κρυπτογράφηση.

    Γνωρίζεις αν υπάρχει τρόπος να μετατραπεί σε 128bit κρυπτογράφηση ?
    Αν όχι, υπάρχει κάποια αξιόπιστη πηγή που θα μπορούσες να με παραπέμψεις?

    Ευχαριστώ προκαταβολικά.

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems