2010-10-10 10 views
7

Próbuję zaszyfrować niektóre ciągi w aplikacji Common Lisp, nad którą pracuję. Pakiet sd-sha1 wydaje się być nieobsługiwany i przez pewien czas był oceniany na stronie CLiki, co sugeruje użycie zamiast niego programu Ironclad. Wystarczająco uczciwe,Hashing z wirem i flexi-strumieniami

=> (require 'ironclad) 
NIL 

Ironclad nie wykonuje jednak trawienia ciągów; jest to stwierdzone na stronie projektu jako celowy wybór projektu, co powinienem zrobić, to przekonwertować mój ciąg znaków na ciąg bajtowy i skrót. Innymi słowy

=> (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there")) 
#(114 108 118 85 62 26 63 222 162 145 52 243 110 106 242 234 5 236 92 206) 

Ok, teraz jest to, że punkt całego tego ćwiczenia jest wydostać się ciąg SHA1-hashed pierwotnego wejścia strun, co oznacza, że ​​naprawdę chcą przekształcić powyższe powrotem format ciągów. Ale,

=> (flexi-streams:octets-to-string 
    (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there")) 
    :external-format :utf-8) 

This sequence can't be decoded using UTF-8 as it is too short. 
1 octet missing at then end. 
    [Condition of type FLEXI-STREAMS:EXTERNAL-FORMAT-ENCODING-ERROR] 

Restarts: 
    0: [ABORT] Exit debugger, returning to top level. 
Inną opcją jest zezwolenie na flexi-streams wnioskowanie o poprawnym kodowaniu.

=> (flexi-streams:octets-to-string 
     (ironclad:digest-sequence 
     :sha1 (flexi-streams:string-to-octets "Hello there"))) 
"rlvU>?Þ¢4ónjòêì\\Î" 

Jaki rodzaj prac, ale mam wrażenie, że wynik nie powinien zawierać znaków kontrolnych. Zgodnie z flexi-strumieni domyślne kodowanie to :latin, więc nie jestem pewien, co robić na tym etapie.

Co robię źle? W jaki sposób uzyskać ciąg znaków reprezentujący ciąg strawiony SHA1 w Common Lisp?

Jeśli to ma znaczenie, używam SBCL (wersja z apt-get, co jest chyba 1.0.29) przez Emacsa + SLIME.

Odpowiedz

9

Oktety, które otrzymujesz z ironclad:digest-sequence, są oznaczone jako w skrócie SHA1. Chcesz ciąg reprezentujący szesnastkowe kodowanie tych bajtów. Ironclad ma wbudowaną funkcję: ironclad:byte-array-to-hex-string.

+1

Człowieku, muszę się nauczyć czytać kompletne dokumenty, zanim zapytam o rzeczy. Strona Ironclad zawiera powyższe funkcje narzędzia. Innymi słowy, co powinienem był zrobić: '(ironclad: byte-array-to-hex-string (ironclad: digest-sequence: sha1 (ironclad: ascii-string-bytete-array" Hello there "))) ' zamiast wprowadzania flexi-strumieni do tego (chociaż prawdopodobnie byłoby to nadal przydatne, gdybym nie miał do czynienia z prostymi ciągami ASCII). Dzięki za wskazanie mi właściwego kierunku. – Inaimathi

+0

Babel jest również pomocny w kodowaniu ciągów znaków spoza ASCII do wektorów oktetowych. – Xach