2013-02-25 4 views
0

Je dois créer un mot de passe crypté pour un serveur. Ce serveur utilise le cryptage Blowfish pour effectuer le cryptage. Maintenant, voici les informations que j'ai:Création d'un mot de passe crypté avec BLOWFISH avec octet [24] longueur

  1. KEY: "12345678abcdefgmypassword"
  2. Taille du bloc: 8 octets - 64 bits
  3. FIN BYTES: octet [24]

Les données que je vouloir chiffrer est "ABCDEFG12345678".

Le problème que j'ai est d'obtenir le cryptage qui est seulement de 24 octets max où j'en reçois 48 à chaque fois. Je pense que mon plus gros problème est que je n'arrive pas à comprendre ce qui devrait arriver!

Voici une partie de mon code:

> BlowFish b = new BlowFish("12345678abcdefgmypassword"); 
> Here I get the key array of byte[12] 
> plainText = "ABCDEF"; 
> cipherText = b.Encrypt_CBC(plainText); 
> var encodedString = System.Text.Encoding.ASCII; 
> byte[] myByteArray = encodedString.GetBytes(cipherText); 

Maintenant, les questions que j'ont: 1. Quelle est la taille du bloc? Et comment l'utiliser? 2. Comment obtenir des octets inférieurs ou égaux à l'octet [24]? Je souhaite vraiment que certains d'entre vous puissent aider mon cerveau à aller dans la bonne direction. Merci.

+0

Voulez-vous dire cryptage blowfish, ou bcrypt hashing? – CodesInChaos

+0

Je suppose que vous avez foiré l'encodage quelque part. – CodesInChaos

+0

L'utilisation de l'ASCII sur un texte chiffré ne peut pas être correcte. Si 'Encrypt_CBC' renvoie une chaîne hexadécimale, vous devez lui appliquer un décodage hexadécimal. – CodesInChaos

Répondre

0

Block size est la quantité de données sur laquelle un chiffrement de bloc fonctionne en même temps. Par exemple, si une taille de bloc d'un algorithme de cryptage est de 128 bits, alors en ASCII, il y aurait 16 caractères. Pour utiliser une taille de bloc, vous devez segmenter votre "texte en clair" (texte qui n'a pas encore été chiffré) en blocs de 64 bits (dans votre cas). Ensuite, passez chaque bloc dans le cryptage et concaténez la sortie. (Si vous implémentez le chiffrement ECB, ce qui n'est pas recommandé).

Comme je l'ai dit plus haut, vous devez découper votre texte en blocs. Le dernier bloc peut avoir la taille de bloc nécessaire et nécessitera padding.

Espérons que cela vous met sur la bonne voie :)

+0

À quoi ressemblerait une partie du code? > Blowfish b = nouveau Blowfish (hexkey). Comment puis-je obtenir la clé hexadécimale de "12345678abcdefgmypassword" ?? –

0

Vous pourriez avoir un regard sur le code source ici http://www.schneier.com/code/blowfish.cs il peut vous aider à mieux comprendre comment cela fonctionne. Aussi un excellent livre sur la cryptographie qui explique les détails de la façon dont ces algorithmes travail est la cryptographie appliquée par Schneier trouvée ici http://www.amazon.com/gp/aw/d/0471117099/

Edit:

D'accord, je l'ai eu le temps de jouer avec cela et je pense que je sais ce que le le problème que vous rencontrez est. La raison pour laquelle vous vous retrouvez avec 48 octets de données au lieu de 24 est parce que vous essayez de manipuler la représentation sous forme de chaîne du texte chiffré qui a une longueur de 48 octets pour afficher tout le texte chiffré en ASCII. Tout ce que vous devez faire est de convertir la représentation de la chaîne ascii en un tableau d'octets. La capture est (vous étiez sur la bonne voie), vous devez le faire de la même manière que la méthode encrypt. Voici le code pour le faire:

class Program 
{ 
    private static byte[] HexToByte(string hex) 
    { 
     byte[] r = new byte[hex.Length/2]; 
     for (int i = 0; i < hex.Length - 1; i += 2) 
     { 
      byte a = GetHex(hex[i]); 
      byte b = GetHex(hex[i + 1]); 
      r[i/2] = (byte)(a * 16 + b); 
     } 
     return r; 
    } 



    private static byte GetHex(char x) 
    { 
     if (x <= '9' && x >= '0') 
     { 
      return (byte)(x - '0'); 
     } 
     else if (x <= 'z' && x >= 'a') 
     { 
      return (byte)(x - 'a' + 10); 
     } 
     else if (x <= 'Z' && x >= 'A') 
     { 
      return (byte)(x - 'A' + 10); 
     } 
     return 0; 
    } 

    static void Main(string[] args) 
    { 
     BlowFish b = new BlowFish("12345678abcdefgmypassword"); 
     string plainText = "ABCDEFG12345678"; 
     string cipherText = b.Encrypt_CBC(plainText); 
     MessageBox.Show(cipherText); 
     plainText = b.Decrypt_CBC(cipherText); 
     byte[] myByteArray = HexToByte(cipherText); 
     MessageBox.Show(plainText); 

    } 
} 

Les méthodes de HexToByte et GetHex sont copiés directement à partir de la classe Blowfish ce qui est utilisé sur le texte brut lors du cryptage et de décryptage. Notez qu'en mode CBC sur une chaîne, l'IV (vecteur d'initialisation) est copié au début de la chaîne de sorte que les 8 premiers octets sont les IV.Sur un échantillon de ce code, voici ce que j'ai obtenu.

cryptogramme est "2866ccafa647d82e7c74e135dbdcb9060cefea39b9b84964" en hexadécimal ascii represenation myByteArray est identique à l'exception de son octet dans [24]. J'espère que cela aidera l'homme bonne chance!

+0

J'utilise actuellement la classe blowfish mais je ne sais pas quoi utiliser dans le code. Il me semble que je dois créer une chaîne hexadécimale à partir de ma chaîne de mot de passe pour entrer dans le code. Mais cette partie m'échappe! –

+0

@Phillip Kemp D'après ce que je vois dans la classe, l'utilisation des chaînes est très bien. C'est ce que vous faites ensuite avec le texte chiffré, c'est probablement le problème. Comment envoyez-vous ces données au serveur? Je ne sais pas exactement ce que vous essayez de faire? – ValueforValue

Questions connexes