好的,所以我已经梳理了互联网以解决我的问题,我只能把它归结为对R的工作方式有点天真。
下面是我的函数代码,该函数从系统时钟生成公钥和私钥,并使用它来尝试解密加密的消息。这个位工作正常,但很明显,当它经历不同的随机生成时,会返回大量的垃圾和NULL数据。
我想通过使用grep并测试该grep的结果是否为1来过滤掉这个,是这样,解码后的消息将被放入列表中。
问题是,无论我如何提出if语句,我的列表都会被无意义的条目和NULL条目混乱。 我试过了,!is.null,is.character。测试== 1.等等,但似乎没有任何作用。列表根本没有填充,或者由遍历if语句的每个条目填充。
任何建议都将不胜感激。谢谢:))
编辑:好的,原谅我,因为这些是复制和粘贴作业,以提供清晰度。第一个代码是我用来加密消息的代码。
require(gmp)
source("convert.R")
p <- nextprime(urand.bigz(size=51, seed=as.bigz(Sys.time())))
q <- nextprime(urand.bigz(size=50))
n <- p*q
finde <- function(phi) {
r <- floor(log(phi, base = 2))
y <- 0 # initialise
while(y != 1) {
e <- urand.bigz(nb = 1, size = r)
y <- gcd.bigz(e, phi)
}
return(e)
}
phi <- (p-1) * (q-1)
e <-finde(phi)
d <- inv.bigz(e, phi)
text1 <- c("I want to eat a baby panda with my bare teeth and hands. Just so I know there's something else in this world suffering more than myself, right now.")
m <- blocks(text1, n) # arguments are text1 (message) and n (public key)
u <- as.bigz((as.bigz(m, n)^e))
dput(u, file="codedmessage.R")
第二个是“convert.R”源文件中包含的代码:
blocks <- function(txt, n) {
x <- strtoi(charToRaw(txt), 16L)
ll <- length(x)
bl <- floor(log(n, base=256)) # block length (how large the blocks must be)
nb <- floor(ll / bl)
wp <- bl*nb
rem <- ll - wp
s <- as.bigz(vector(mode="numeric", length=0))
u <- 0
while(u < wp) {
total <- as.bigz(0)
for(i in 1:bl) {
total <- 256 * total + x[i+u]
}
u <- u + bl
s <- c(s, total)
}
if(rem > 0) {
total <- as.bigz(0)
for(i in 1:rem) {
total <- 256 * total + x[i + wp]
}
s <- c(s, total)
}
return(s)
}
words <- function(blocknum) {
w <- vector(mode="numeric", length=0)
wl <- blocknum
while(as.bigz(wl) > 0) {
rem <- as.bigz(wl) %% 256
w <- c(rem, w)
wl <- (as.bigz(wl) - as.bigz(rem)) / 256
}
return(w)
}
dectext <- function(listnum) {
len <- length(listnum)
newls <- as.integer(vector(mode="numeric", length=0))
for(i in 1:len) {
temp <- as.integer(words(listnum[i]))
newls <- c(newls, temp)
}
return(rawToChar(as.raw(newls)))
}
最后一个代码是解密和编译列表函数,我遇到了问题。
finde <- function(phi) {
r <- floor(log(phi, base = 2))
y <- 0 # initialise
while(y != 1) {
e <- urand.bigz(nb = 1, size = r)
y <- gcd.bigz(e, phi)
}
return(e)
}
FindKey <- function(a, y) {
x <<- 1 #initialisation
decodedlist <<- list() #initialisation
while (x<7200) {
print(x)
print(a)
p <- nextprime(urand.bigz(size=51, seed=as.bigz(a)))
q <- nextprime(urand.bigz(size=50))
n <- p*q
phi <- (p-1) * (q-1)
phi
e <-finde(phi)
d <- inv.bigz(e, phi)
recieved<-dget(file=y)
v<-as.bigz(as.bigz(recieved, n)^d)
tryCatch({
decodetext<-dectext(v)
Decrypt<- capture.output(cat(decodetext))
print(Decrypt)
test <- grep("and", Decrypt)
if (!is.null(Decrypt)){
if (is.character(Decrypt)){
decodedlist[[x]] <<- Decrypt
}else{return}}else{return}
}, warning = function(war) {
return()
}, error = function(err){
return()
}, finally = {
x=x+1
a=a-1})
}
}
很抱歉很久..但我真的不知道该怎么做:(
答案 0 :(得分:0)
我找到了解决问题的“解决方案”,尽管我编写的代码不同。
我不太了解其原因,但是我认为问题在于列表存储了一些带有NULL引用的东西(Reps to Acccumulation for the hint; D)因此在技术上并不是NULL本身。 我的解决方法是避免完全使用if语句,而是找到了一种更有效的方法来过滤掉我为生成大质数而编写的程序中的NULL列表条目。
任何能够弄明白我正在学习的人的额外积分;)
#Combine two lists and remove NULL entries therein.
Prime_List2 <<- PrimeList[-which(sapply(PrimeList, is.null))]
Prime_List1 <<- PrimeList[-which(sapply(PrimeList, is.null))]