在R

时间:2016-08-22 10:37:02

标签: r encryption

我有一个密码,我存储在纯文本文件中。我想以某种方式混淆它,以防有人在看我的显示器。

理想情况下,我想用另一个默认字符串(例如" 123")加密密码,并获得我的密码的模糊版本。然后,当我在代码中需要密码时,我想用相同的字符串解密密码" 123"。混淆密码和普通密码的长度也不同。

所以,逻辑应该是:

encrypt(password, "123") -> obf_string
decrypt(obf_string, "123") -> password

我该怎么做?

P.S。我知道它无论如何都不安全,但这就是我现在想要的。

2 个答案:

答案 0 :(得分:1)

跟进@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

请注意,警告的数量等于非数字字符的数量。如suppressWarnings()所解释的那样,可以使用> 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 来抑制此问题。我的偏好是始终表达R警告。

starting light

答案 1 :(得分:0)

一种快速混淆的方法是通过随机数生成,这是我的尝试:

encrypt <- function(password, string){
        set.seed(password)
        encr <- round(runif(nchar(string), 0, 9))
        y <- as.integer(substring(string, seq(nchar(string)), seq(nchar(string)))) + encr
        return(y)
}

decrypt <- function(password, string){
        set.seed(password)
        encr <- round(runif(nchar(string), 0, 9))
        y <- paste0(string - encr, collapse="")
        return(y)
}

你的字符串是例如1984。你只需要选择一个密码,例如2016

> encrypt(2016, "1984")
[1]  3 10 16  5

您将它们提供给encrypt()并且该函数返回与您的字符串大小相同的数字向量。要使用密码和向量使用decrypt()取回字符串:

> decrypt(2016, c(3,10,16,5))
[1] "1984"

进一步允许文本连接的不太天真的替代方法是使用base64enc包通过base64进行编码/解码:

install.packages("base64enc")
library(base64enc)
base64encode(c(2,0,0,6))
base64decode("AgAABg==")