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.
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
Babel jest również pomocny w kodowaniu ciągów znaków spoza ASCII do wektorów oktetowych. – Xach