Javascript MCrypt类使用simcard序列号作为SecretKey

Javascript MCrypt类使用simcard序列号作为SecretKey,javascript,android,mcrypt-js,Javascript,Android,Mcrypt Js,如何读取Simcard序列号并使用前16个数字 作为秘钥 我做错了什么 好的,现在我明白你的问题了。 活动继承自上下文-因此,当您在类MCrypt中调用getSystemService时,您确实希望调用super.getSystemService 如果您想在另一个类(如MCrypt)中提供上下文,可以将其作为参数传递给该类的方法(您已经拥有的构造函数),并保留对它的引用,等等。 将上下文参数添加到MCrypt中的构造函数: public class MCrypt { Context mConte

如何读取Simcard序列号并使用前16个数字 作为秘钥

我做错了什么


好的,现在我明白你的问题了。 活动继承自上下文-因此,当您在类MCrypt中调用getSystemService时,您确实希望调用super.getSystemService

如果您想在另一个类(如MCrypt)中提供上下文,可以将其作为参数传递给该类的方法(您已经拥有的构造函数),并保留对它的引用,等等。
将上下文参数添加到MCrypt中的构造函数:

public class MCrypt {
Context mContext;
TelephonyManager mtelemamanger; 
    public MCrypt (Context context)//this is a constructor
    {
        mContext = context;
        mtelemamanger = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
...
将以下权限添加到您的
Androidmanifest.xml
文件中

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
函数的作用是:返回一个字符串,该字符串包含提供商信息等。如果您想获取纯sim序列号,必须获取最后14位数字

String SecretKey = deviceid.substring(Math.max(0, deviceid.length() - 14));
这是我的工作代码

/**
*工作室于2017年6月2日创建。
*/
导入android.content.Context;
导入android.telephony.TelephonyManager;
导入java.security.NoSuchAlgorithmException;
导入javax.crypto.Cipher;
导入javax.crypto.NoSuchPaddingException;
导入javax.crypto.spec.IvParameterSpec;
导入javax.crypto.spec.SecretKeySpec;
公共类MCrypt{
电话管理员mtelemamanger;
私有静态字符[]十六进制字符={0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
私有静态IvParameterSpec ivspec;
私有静态SecretKeySpec keyspec;
私有静态密码;
MCrypt(上下文控制)
{
mtelemamanger=(TelephonyManager)con.getSystemService(Context.TELEPHONY_服务);
字符串deviceid=mtelemamanger.getSimSerialNumber();
字符串iv=设备ID.子字符串(0,16);
ivspec=新的IvParameterSpec(iv.getBytes());
String secretKey=“0123456789abcdef”;
keyspec=newsecretkeyspec(secretKey.getBytes(),“AES”);
试一试{
cipher=cipher.getInstance(“AES/CBC/NoPadding”);
}捕获(NoSuchAlgorithmException | NoSuchPaddingException e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共字节[]加密(字符串文本)引发异常
{
if(text==null | | text.length()==0)
抛出新异常(“空字符串”);
字节[]加密;
试一试{
cipher.init(cipher.ENCRYPT_模式,keyspec,ivspec);
加密=cipher.doFinal(padString(text).getBytes());
}捕获(例外e)
{
抛出新异常(“[encrypt]”+e.getMessage());
}
返回加密;
}
静态字节[]解密(字符串代码)引发异常
{
if(code==null | | code.length()==0)
抛出新异常(“空字符串”);
字节[]已解密=空;
试一试{
cipher.init(cipher.DECRYPT_模式,keyspec,ivspec);
解密=cipher.doFinal(十六字节(代码));
//删除尾随零
如果(已解密。长度>0)
{
int trim=0;
对于(int i=decrypted.length-1;i>=0;i--)如果(decrypted[i]=0)trim++;
如果(修剪>0)
{
byte[]newArray=新字节[decrypted.length-trim];
System.arraycopy(已解密,0,newArray,0,解密.length-trim);
解密=新数组;
}
}
}捕获(例外e)
{
抛出新异常(“[decrypt]”+e.getMessage());
}
返回解密;
}
公共静态字符串bytesToHex(字节[]buf)
{
char[]chars=新字符[2*buf.长度];
对于(int i=0;i>>4];
字符[2*i+1]=十六进制字符[buf[i]&0x0F];
}
返回新字符串(字符);
}
专用静态字节[]十六进制字节(字符串str){
如果(str==null){
返回null;
}else if(str.length()<2){
返回null;
}否则{
int len=str.length()/2;
字节[]缓冲区=新字节[len];

对于(int i=0;i在什么情况下使用此密码?如果这会限制用户数据,这可能是一个坏主意,因为用户可能会从其网络运营商处收到一个替换SIM卡,或移动到另一个网络。这将导致其以前的密钥无效。应用程序解密只能与此SIM卡一起使用。如果用户通过应用程序登录simcard序列号被发送到已经完成的数据库。我只需要作为simcard序列号的密钥即可。现在我看到了您的问题。活动继承来自上下文-因此,当您在类MCrypt中调用getSystemService时,您确实想调用super.getSystemService。但您不需要继承表单上下文,使其无法工作。请参阅我的更新答案。“读取Simcard序列号不工作”对任何人都没有用处。错误是什么?显示日志(错误日志)。我测试了我的代码,它工作正常。不工作问题是
getSystemService
其标记为“它不工作”如果没有用处,请发布编译时错误。当您发现错误时,它会起作用。您是否从活动中调用“new MCrypt(this)”?如果我尝试私有字符串deviceid=“894310210159403811111456457657845786485458”;然后Encoder works Simcard Serial是8943102101594038,我可以读取我使用的编码数据NO Jon
MCrypt MCrypt=new MCrypt();
和`
String timedate=new String(MCrypt.decrypt(job.getString(“timedate”));
我告诉过你要重新使用构造函数,而不是再添加一个。为什么我要告诉你做改变,而你却不使用它?
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
TelephonyManager telemamanger = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
String deviceid = telemamanger.getSimSerialNumber();
String SecretKey = deviceid.substring(Math.max(0, deviceid.length() - 14));
/**
 * Created by Studio on 02/06/2017.
 */

import android.content.Context;
import android.telephony.TelephonyManager;

import java.security.NoSuchAlgorithmException;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class MCrypt {
    TelephonyManager mtelemamanger;
    private static char[] HEX_CHARS = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    private static IvParameterSpec ivspec;
    private static SecretKeySpec keyspec;
    private static Cipher cipher;
    MCrypt(Context con)
        {
            mtelemamanger = (TelephonyManager) con.getSystemService(Context.TELEPHONY_SERVICE);
            String deviceid = mtelemamanger.getSimSerialNumber();
            String iv = deviceid.substring(0, 16);
            ivspec = new IvParameterSpec(iv.getBytes());
            String secretKey = "0123456789abcdef";
            keyspec = new SecretKeySpec(secretKey.getBytes(), "AES");

        try {
            cipher = Cipher.getInstance("AES/CBC/NoPadding");
        } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }
    public byte[] encrypt(String text) throws Exception
    {
        if(text == null || text.length() == 0)
            throw new Exception("Empty string");

        byte[] encrypted;

        try {
            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

            encrypted = cipher.doFinal(padString(text).getBytes());
        } catch (Exception e)
        {
            throw new Exception("[encrypt] " + e.getMessage());
        }

        return encrypted;
    }

    static byte[] decrypt(String code) throws Exception
    {
        if(code == null || code.length() == 0)
            throw new Exception("Empty string");

        byte[] decrypted = null;

        try {
            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            decrypted = cipher.doFinal(hexToBytes(code));
            //Remove trailing zeroes
            if( decrypted.length > 0)
            {
                int trim = 0;
                for( int i = decrypted.length - 1; i >= 0; i-- ) if( decrypted[i] == 0 ) trim++;

                if( trim > 0 )
                {
                    byte[] newArray = new byte[decrypted.length - trim];
                    System.arraycopy(decrypted, 0, newArray, 0, decrypted.length - trim);
                    decrypted = newArray;
                }
            }
        } catch (Exception e)
        {
            throw new Exception("[decrypt] " + e.getMessage());
        }
        return decrypted;
    }


    public static String bytesToHex(byte[] buf)
    {
        char[] chars = new char[2 * buf.length];
        for (int i = 0; i < buf.length; ++i)
        {
            chars[2 * i] = HEX_CHARS[(buf[i] & 0xF0) >>> 4];
            chars[2 * i + 1] = HEX_CHARS[buf[i] & 0x0F];
        }
        return new String(chars);
    }


    private static byte[] hexToBytes(String str) {
        if (str==null) {
            return null;
        } else if (str.length() < 2) {
            return null;
        } else {
            int len = str.length() / 2;
            byte[] buffer = new byte[len];
            for (int i=0; i<len; i++) {
                buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);
            }
            return buffer;
        }
    }



    private static String padString(String source)
    {
        char paddingChar = 0;
        int size = 16;
        int x = source.length() % size;
        int padLength = size - x;

        for (int i = 0; i < padLength; i++)
        {
            source += paddingChar;
        }

        return source;
    }
}