跟进@zach cmets,如果发生攻击,此过程将不安全。如果您想混淆一个字符串(例如,来自路过并看着屏幕的人),这非常有用,这个问题并不暗示安全性。
我在上一个答案中报告的函数的这个版本也接受带有数字和字母的字符串:
obfuscate <- function(password, string){
set.seed(password)
vec <- substring(string, seq(nchar(string)), seq(nchar(string)))
encr <- y <- vector("list",length(vec))
letters <- rep(letters,2) # prolongue letters sequence
for (i in 1:length(vec)){
ifelse(is.numeric(vec[i]), # extracting encryption numbers
encr[[i]] <- round(runif(1, 0, 9)), # if numeric
encr[[i]] <- round(runif(1, 0, 26))) # if letters
ifelse( !is.na(as.numeric(vec[i])) , # encrypting
y[[i]] <- as.numeric(vec[i]) + encr[[i]], # if numeric
y[[i]] <- letters[which(letters==vec[i])[1] + encr[[i]]] ) # if letters
}
return(unlist(y))
}
reveal <- function(password, y){
set.seed(password)
for (i in 1:length(y)){
ifelse(is.numeric(y[i]), # extracting encryption numbers
encr[[i]] <- round(runif(1, 0, 9)), # if numeric
encr[[i]] <- round(runif(1, 0, 26))) # if letters
ifelse( !is.na(as.numeric(y[i])) , # encrypting
y[[i]] <- as.numeric(y[i]) - encr[[i]], # if numeric
y[[i]] <- letters[which(letters==y[i])[1] - encr[[i]]] ) # if letters
}
return(paste0(unlist(y), collapse=""))
}
这是一个例子:
> obfuscate(2016,"a6b8")
[1] "f" "10" "x" "11"
Warning messages:
1: In ifelse(!is.na(as.numeric(vec[i])), y[[i]] <- as.numeric(vec[i]) + :
NAs introduced by coercion
2: In ifelse(!is.na(as.numeric(vec[i])), y[[i]] <- as.numeric(vec[i]) + :
NAs introduced by coercion
请注意,警告的数量等于非数字字符的数量。正如in this SO question 所解释的,这可以通过suppressWarnings() 抑制。我的偏好是总是表达 R 警告。
> reveal(2016,c("f","10","x","11"))
[1] "a6b8"
Warning messages:
1: In ifelse(!is.na(as.numeric(y[i])), y[[i]] <- as.numeric(y[i]) - :
NAs introduced by coercion
2: In ifelse(!is.na(as.numeric(y[i])), y[[i]] <- as.numeric(y[i]) - :
NAs introduced by coercion