tarjeta - que es encriptar
¿Cómo leo un archivo encriptado desde un disco con R? (1)
Tengo un conjunto de datos confidenciales que nunca deben almacenarse sin cifrar en el disco. ¿Puedo ocuparme de esto o el cifrado de disco completo es mi única opción?
Tengo la sensación de que hay una manera más fácil de hacerlo, pero el paquete de digest
, que es el cifrado AES, es lo más parecido a lo que está pidiendo. Esto debería ayudarte a comenzar.
# write encrypted data frame to file
write.aes <- function(df,filename, key) {
require(digest)
zz <- textConnection("out","w")
write.csv(df,zz, row.names=F)
close(zz)
out <- paste(out,collapse="/n")
raw <- charToRaw(out)
raw <- c(raw,as.raw(rep(0,16-length(raw)%%16)))
aes <- AES(key,mode="ECB")
aes$encrypt(raw)
writeBin(aes$encrypt(raw),filename)
}
# read encypted data frame from file
read.aes <- function(filename,key) {
require(digest)
dat <- readBin(filename,"raw",n=1000)
aes <- AES(key,mode="ECB")
raw <- aes$decrypt(dat, raw=TRUE)
txt <- rawToChar(raw[raw>0])
read.csv(text=txt)
}
# sample data
set.seed(1) # for reproducible example
data <- data.frame(x=rnorm(10),y=rpois(10,1),
z=letters[1:10],w=sample(T:F,10,replace=T))
set.seed(123581321)
key <- as.raw(sample(1:32,32))
write.aes(data,"encrypted.dat",key)
result <- read.aes("encrypted.dat",key)
# did it work?
all.equal(data,result)
# [1] TRUE
Esto usa cifrado AES en modo ECB. Obviamente, necesita usar la misma clave para cifrar y descifrar. write.aes(...)
convierte el marco de datos en una cadena de texto con formato csv, lo convierte en crudo (lo cual es necesario para AES), rellena el vector sin formato con un múltiplo de 16 bytes (también se requiere para AES), encripta y escribe en un archivo binario. read.aes(...)
básicamente invierte el proceso.
Este es solo un ejemplo, destinado a ser modificado para satisfacer sus necesidades. Por ejemplo, esto guarda el marco de datos sin nombres de fila, lo que podría o no ser un problema.