跟進@zach評論,這個程序在攻擊的情況下是不安全的。這是特別有用的是你想混淆一個字符串(例如,從某人經過並看着屏幕),這個問題並不暗示安全性。
這是我的功能版本我以前的答案報道還接受帶有數字和字母的字符串:
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
Andrie德弗里斯寫了關於這個問題的好文章:https://www.r-bloggers.com/securely-storing-your-secrets-in-r-code/ – NJBurgo
雖然第一篇文章更有用:http://blog.revolutionanalytics.com/2015/11/how-to-store-and-use-authentication-details-with-r.html – NJBurgo
如果您正在處理密碼,請勿加密/解密;相反,使用散列。例如'digest :: digest(password)'返回一個散列,你可以放心地輸入代碼。當用戶輸入密碼時,您將其與「正確」的密碼進行匹配,因此您不必解密。看到維基頁面https://en.wikipedia.org/wiki/Cryptographic_hash_function – nicola