2011-01-18 13 views
6

Hola, ¿hay alguna función nativa (no instalar otra gema, o no llamar a openssl desde el shell) para comprimir una cadena o encriptar una cadena?métodos nativos de ruby ​​para comprimir/cifrar cadenas?

tipo de como mysql compress.

"a very long and loose string".compress
output = "8d20\1l\201"

"8d20\1l\201".decompress
output = "a very long and loose string"?

y del mismo modo para cifrar un trozo de cuerda?

Respuesta

14

De http://ruby-doc.org/stdlib/libdoc/zlib/rdoc/classes/Zlib.html

# aka compress 
    def deflate(string, level) 
    z = Zlib::Deflate.new(level) 
    dst = z.deflate(string, Zlib::FINISH) 
    z.close 
    dst 
    end 

    # aka decompress 
    def inflate(string) 
    zstream = Zlib::Inflate.new 
    buf = zstream.inflate(string) 
    zstream.finish 
    zstream.close 
    buf 
    end 

de encriptación en http://snippets.dzone.com/posts/show/991

require 'openssl' 
require 'digest/sha1' 
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") 
c.encrypt 
# your pass is what is used to encrypt/decrypt 
c.key = key = Digest::SHA1.hexdigest("yourpass") 
c.iv = iv = c.random_iv 
e = c.update("crypt this") 
e << c.final 
puts "encrypted: #{e}\n" 
c = OpenSSL::Cipher::Cipher.new("aes-256-cbc") 
c.decrypt 
c.key = key 
c.iv = iv 
d = c.update(e) 
d << c.final 
puts "decrypted: #{d}\n" 
+0

Según los documentos de Zlib, 'Zlib :: Deflate.deflate (string [, level])' y 'Zlib :: Inflate .inflate (string [, level]) 'son" casi equivalentes "a los métodos de desinflado/inflado anteriores. –

5

OpenSSL y Zlib. Hay un ejemplo de uso de OpenSSL en this question.

+2

No es que realmente implica ningún orden de la operación, pero se obtiene una mejor tasa de compresión si el texto se comprime primero y luego encriptada. –

+0

No debería obtener virtualmente ninguna compresión si el archivo se cifra primero. Lea esto: https://blog.appcanary.com/2016/encrypt-or-compress.html – JLB

Cuestiones relacionadas