我很好奇如何加密包中的R函数,这样一旦构建了包,就可以调用该函数,但是找不到后面的算法。该算法用R。
编写假设我们在Rcpp中创建一个Function
并使用导出的Rcpp函数包装器调用它。源代码是一个字符串,用于创建要评估为Function
的表达式。
#include <Rcpp.h>
using namespace Rcpp;
ExpressionVector secret_expr("function(x) x + 1");
Function secret_fun = secret_expr.eval();
//' Secret function
//' @param x a numeric vector
//' @export
// [[Rcpp::export]]
SEXP SF(SEXP x)
{
return secret_fun(x);
}
一旦包含上述C ++代码的包构建为二进制文件,我们似乎无法查看secret_fun
的正文。但是,仍然可以通过在shell中调用strings package.so | grep function
来显示函数体,其中package.so
是构建包的二进制文件。
这意味着为了隐藏函数体,我们不能直接在C ++代码中编写它。我发现https://stackoverflow.com/a/1360175/2906900非常有趣,所以我用上面的例子测试它:
#include "HideString.h"
#include <Rcpp.h>
using namespace Rcpp;
DEFINE_HIDDEN_STRING(Secret, 0x2f, ('f')('u')('n')('c')('t')('i')('o')('n')('(')('x')(')')('x')('+')('1'))
ExpressionVector secret_expr(GetSecret());
Function secret_fun = secret_expr.eval();
//' Secret function
//' @param x a numeric vector
//' @export
// [[Rcpp::export]]
SEXP SF(SEXP x)
{
return secret_fun(x);
}
这次我无法通过strings
找到任何有意义的功能,而且功能完全相同。因此,似乎很有可能以这种方式加密敏感算法。但我想知道是否有一种简单的方法可以解决这个问题?