Gå til innhold

Kryptering som gir samme lengde som inputen?


Anbefalte innlegg

Altså, går det an med .NET sine cryptoprovidere, som f.eks. RijndaelManaged, å få til dette:

 

Jeg krypterer "HALLO"

Og får tilbake "LBJFK" (kun eksempel)

Som dere ser, vil jeg ha samme mengde bytes som den originale stringen/bytearrayen...

 

Slik som det er nå, krypterer jeg 8 bytes, og får 32 tilbake :p

 

Koden:

		Dim SHA As New System.Security.Cryptography.SHA256CryptoServiceProvider
	SHA.ComputeHash(System.Text.Encoding.UTF8.GetBytes("psw"))

	Dim RJ As New System.Security.Cryptography.RijndaelManaged
	RJ.BlockSize = 256
	RJ.Key = SHA.Hash
	RJ.IV = SHA.Hash

	Dim MemorySTR As New IO.MemoryStream
	Dim CryptoSTR As New CryptoStream(MemorySTR, RJ.CreateEncryptor, CryptoStreamMode.Write)

	Dim b() As Byte = System.Text.Encoding.UTF8.GetBytes("12345678")
	CryptoSTR.Write(b, 0, b.Length)
	CryptoSTR.FlushFinalBlock()

	MemorySTR.Position = 0
	ReDim b(MemorySTR.Length - 1)
	MemorySTR.Read(b, 0, MemorySTR.Length)

 

Noen måte å gjøre dette på ved hjelp av de innebygde providerene? :)

Endret av Wubbable
Lenke til kommentar
Videoannonse
Annonse

Lite trolig, men her har du en enkelt liten greie som krypterer ganske greit og som resulterer i samme lengde:

static public class EncryptionClass
{
 public static string Encrypt(string pPassedString, string pPassword)
 {
string WorkString = pPassedString;
int strLength = WorkString.Length;
int passLength = pPassword.Length;
char[] tmpWorkString = WorkString.ToCharArray();
int i = 0;
for(int o = 0; o < strLength; o++)
{
  byte num1 = (byte)tmpWorkString[o];
  byte num2 = (byte)pPassword[i];
  byte xored = (byte)(num1 ^ num2);
  char Temp = (char)xored;
  tmpWorkString[o] = Temp;
  i++;
  if(i >= passLength)
	i = 0;
}
return new string(tmpWorkString);
 }
}

Sånn cirka fordi jeg måtte ta det ut av sammenhengen i min egen rutine fordi jeg også legger på checksum og kontrollsiffere. Dette er selvsagt et gitt antall siffer på egne posisjoner i den krypterte teksten, men du ville kunn ha samme lengde og da blir det sånn.

 

hth

edt: Var vist noen skrivefeil

Endret av HDSoftware
Lenke til kommentar

Tenkte noe litt sterkere enn XOR da :p

 

edit:

System.Security.Cryptography.{alg}.Mode = CipherMode.CTS

 

Den modusen vil fungere, siden den gir lik lengde som input'en, antatt at input > 1

Problemet er at hverken AES, Rijndael eller TripleDES aksepterer den modusen... Googlet litt også, men uten hell :(

 

Noen ideer? :)

Endret av Wubbable
Lenke til kommentar
Tenkte noe litt sterkere enn XOR da :p

 

edit:

System.Security.Cryptography.{alg}.Mode = CipherMode.CTS

 

Den modusen vil fungere, siden den gir lik lengde som input'en, antatt at input > 1

Problemet er at hverken AES, Rijndael eller TripleDES aksepterer den modusen... Googlet litt også, men uten hell :(

 

Noen ideer? :)

Vell, siden passordet kan være så langt du vill så burde vel en XOR være like bra som noe annet. En kryptering er vel i bunn og grunn endring av bits uansett om det heter 3des, rijndael eller aes. Så vidt jeg vet så er f.eks. Rijndael basert på en seed nøkkel som så krypteres sammen med dataene for å få en ny nøkkel. Selve krypteringen er nok basert på XOR logikk på ett eller annet plan.

 

Rutinen min er jo enkel og krypterer med en ukjent nøkkel. At den går rett frem og tar byte for byte i nøkkelen er jo en smal sak å endre på. F.eks. kan du jo lage logikk som endrer nøkkelen under veis ved å plukke en verdi fra dataene på bakgrunn av tverrsummen av BYTE verdien fra den aktuelle nøkkel verdien. Mange måter å gjøre det på. Er vel kunn Brute-Force som kan knekke dette så vidt jeg kan se, men jeg er jo ingen kryptolog så hva vet vel jeg ;-)

Lenke til kommentar

Fant det ut med Rijndael...

Satte bare paddingmodusen til RJ.Padding = PaddingMode.None :)

 

*teste dekryptering*

 

Fant det ut, til de som er interesserte:

Public Class RJCrypt

Private ICT_Enc As System.Security.Cryptography.ICryptoTransform
Private ICT_Dec As System.Security.Cryptography.ICryptoTransform

Sub New(ByVal password As String)

	Dim SHA As New System.Security.Cryptography.SHA256Managed
	SHA.ComputeHash(System.Text.Encoding.UTF8.GetBytes(password))
	For i As Integer = 0 To 100000 : SHA.ComputeHash(SHA.Hash) : Next

	Dim SB() As Byte = SHA.Hash
	ReDim Preserve SB(15)

	Dim RJM As New System.Security.Cryptography.RijndaelManaged
	RJM.BlockSize = 128
	RJM.Padding = PaddingMode.None
	RJM.Mode = CipherMode.CBC

	ICT_Enc = RJM.CreateEncryptor(SHA.Hash, SB)
	ICT_Dec = RJM.CreateDecryptor(SHA.Hash, SB)

End Sub

Public Sub Encrypt(ByRef buffer() As Byte)

	ICT_Enc.TransformBlock(buffer, 0, buffer.Length, buffer, 0)
	ICT_Enc.TransformFinalBlock(buffer, 0, buffer.Length)

End Sub

Public Sub Decrypt(ByRef buffer() As Byte)

	ICT_Dec.TransformBlock(buffer, 0, buffer.Length, buffer, 0)
	ICT_Dec.TransformFinalBlock(buffer, 0, buffer.Length)

End Sub

End Class

Grunnen til at jeg bruker ICT er at jeg slipper alt vaset med å først ha en cryptostream som skriver til en annen stream, for så å lese den streamen og returne bytene :p

Hastighet :)

 

Men merk: Lengden på buffer() må være en multiple av 16 ^^

 

edit: Måtte legge til transformfinalblock, ellers kunne du f.eks. ikke kryptere en byte() to ganger, så dekryptere to ganger :)

Endret av Wubbable
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...