2017-10-05 5 views
0

さて、私は自分の問題への答えとしてインターネットを梳きましたが、私はそれがRの仕組みにちょっと邪魔になりません。if文が間違ったデータ型を格納するのはなぜですか?

以下は、システムクロックから公開鍵と秘密鍵を生成し、それを使用して暗号化されたメッセージの復号化を試みる関数のコードです。このビットは正常に動作しますが、明らかに異なるランダム世代を経るにつれ、多くのゴミとNULLデータが戻ってきます。

grepを使ってこれをフィルタリングし、そのgrepの結果が1であったかどうかをテストしたかったので、デコードされたメッセージをリストに入れました。

問題は、if文をどのように提案しても、ナンセンスエントリとNULLエントリの両方でリストが乱雑になります。 私はしようとしました!is.null、is.character。テスト== 1. etcなど何も動作するようです。リストがまったく取り込まれないか、または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

'nextprime'と' as.bigz'がベースR.どのパッケージ(複数可)にあるように表示されません。使っていますか?これは私の好奇心です。あなたの問題を解決するのにはあまり関係ありません。 – shea

+0

再現可能な例を示してください。 –

+0

おそらくDecrypt *に* being * nullのないnullが含まれていますか? – Acccumulation

答えて

0

私は私が書いた別のコードの中にもかかわらず、私の問題への解決策「の並べ替え」を見つけました。

私はこれがなぜ機能するのかについてはあまり知識がありませんが、リストはNULL参照(Rept to Accumulation to theヒント; D)を格納していたため、技術的にはNULL自身 私はこの問題を回避するためにif文を使用するのを避ける代わりに、より効率的な方法を見つけました。 f大きな素数を生成するために書いたプログラムの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))] 
関連する問題