r-statistics-fanの日記

統計好き人間の覚書のようなもの

アンドロイドのパターンロック~GIGAZINE

Android OSのパターンロック認証はアルファベット3文字程度のセキュリティ - GIGAZINE

 

面白そうな記事があり、自分でも検証したくなった。

 

パターン認証の各点を

123

456

789

と定義する。

 

試行錯誤して条件を探ったが、

#4つ以上の点をつなぐ

#数はまたげない

 例

5 - 7- 3: o

7-3: x (なぞる線を迂回しても強制的に7-"5"-3になる)

 

ということらしい。

 

コードは下の方に記す。

記事では

>delight.imによるとパターンの数は14万704通りで、これは、大文字・小文字の区別をしたアルファベット3文字の組み合わせが14万608通りであることからほぼ同じ数。つまり、Android OSのパターン認証は、アルファベット3文字のパスワードと同等のセキュリティレベルというわけです。

 

とあったので、140608通りなのかと思ったが

 

> sum(flag)
[1] 389112

 

389112で違う!!!がーん。

でも、

https://raw.githubusercontent.com/delight-im/AndroidPatternLock/master/OUTPUT.txt

これをダウンロードしたら、389112行あるので、ほっとした。

恐らく記事の方が間違いなのであろう。

 

10分以上計算にかかるので注意。恐らく効率が悪い。

以下コード

##android pattern

library(gtools)
ans <- NULL
for (i in 4:9){
temp <- permutations(n = 9, r = i, set=TRUE, repeats.allowed=FALSE)
ans <- c(ans, apply(temp, 1, function(x) paste(x, sep = "", collapse = "")))
}
ans <- as.numeric(ans)

check.ok <- function(x, y, need){ #X=探す文字列 #探す答えの例 #それより前にあるべき数字
ichi.x <- regexpr(x, y)[1]
ichi.need <- regexpr(need, y)[1]
if (ichi.x == -1){ return (1)}
if (ichi.need == -1){ return (0)}
if (ichi.need < ichi.x){ return(1)}
return(0)
}

need.list <- matrix( byrow = TRUE, ncol = 2,c( #x, #need
13, 2,
19, 5,
17, 4,
31, 2,
37, 5,
39, 6,
71, 4,
79, 8,
73, 5,
91, 5,
93, 6,
97, 8,
28, 5,
82, 5,
46, 5,
64, 5
))

check.all <- function(y, need.list = need.list){
temp <- numeric(nrow(need.list))
temp <- apply(need.list, 1, function(x) check.ok(x = x[1], y = y, need = x[2]))
return(all( temp != 0))
}

flag <- logical(length(ans))
flag <- sapply(ans, function(x) check.all(x, need.list = need.list))

sum(flag)