アンドロイドのパターンロック~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)