[R] Encrypt/decrypt in R
Carl Witthoft
carl at witthoft.com
Sun Mar 21 00:17:58 CET 2010
> Hi all,
>
> Does any one know of any encryption/decryption algorithms in R? I'm
> not looking for anything robust - I want some way of printing output
> to the screen that the user can't read immediately, but can decrypt a
> little later. The main thing I don't want to the user to see is a
> number, so (e.g.) ROT13 isn't appropriate.
Nobody seems to have asked what you mean by "don't want the user to see
a number."
Do you mean that there should be no numbers in the output (impossible
unless you stir in ten non-alpha characters), or simply that numbers
should be translated (at least some of the time) into alpha?
Anyway, here's a toy I wrote for my own amusement back when learning R:
# rotrw -- a func to read from a file, rot, and write to
# a new file
# file: name of source file
# rot: number to rot by
# field: ascii or alpha, selects what characters to rot thru
# If select alpha, only alphas are rotted.
# If select ascii, all ascii chars are rotted
rotrw<-function(file,rot=13,field=ascii)
{
readLines(file)->fin
if(field=='alpha')
{
rot13(fin,rot)->tempf
}
else if(field=='ascii')
{
rotit(fin,rot)->tempf
}
else
{
stop("Error: ",field,' is unknown type.\n')
}
# strip the .extension so can get file name and build
# output name 'file'[rot].ext
strsplit(file,split='\\.')->splitfil# to get file name alone
unlist(splitfil)->unfil # makes it a char vector,
# so unlist[1] is name, unlist[2] is ext
paste(unfil[1],rot,field,'.',unfil[2],sep="")->outname
writeLines(tempf,con=outname)
}
rot13 <- function(string,rot=13){
cstr<-as.character(string)
#get fancy: force ROT into 0-25, by shifting negative values and
# taking a modulus:
rtm<-(rot+(rot<0)*26)%%26
old<-paste(c(letters,LETTERS),collapse="")
shift<-c(rtm+1,26,1,rtm)
new<-paste(c(letters[shift[1]:shift[2]],letters[shift[3]:shift[4]],LETTERS[shift[1]:shift[2]],LETTERS[shift[3]:shift[4]]),collapse="")
rotted<-chartr(old = old, new = new, x = string)
return(rotted)
}
rotit <- function(string,rot=13){
library(sfsmisc) #needed for chars8bit()
cstr<-as.character(string)
#get fancy: force ROT into 0-95, by shifting negative values and
# taking a modulus:
rtm<-(rot+(rot<0)*95)%%95
# OLD is full baseline ASCII char set. Note that it's a vector
old<-c(chars8bit(seq(32,126)))
shift<-c(rtm+1,95,1,rtm)
new<-paste(c(old[shift[1]:shift[2]],old[shift[3]:shift[4]]),collapse="")
rotted<-chartr(old = paste(old,collapse=""), new = new, x = string)
return(rotted)
}
More information about the R-help
mailing list